diff --git a/application/modules/courses/controllers/PublicViewController.php b/application/modules/courses/controllers/PublicViewController.php index b42d3bebd0c8ac4039d6966e751802b6ea6faaf8..f5fe310c17a11acd509b55f1c7d36f5bbeb80e90 100644 --- a/application/modules/courses/controllers/PublicViewController.php +++ b/application/modules/courses/controllers/PublicViewController.php @@ -14,9 +14,143 @@ class Courses_PublicViewController extends App_Controller_Action { */ public function allCoursesAction() { - $layout = Zend_Layout::getMvcInstance(); - $layout->disableLayout(); - $this->getFrontController()->setParam('noViewRenderer', true); + $this->_disableLayoutAndView(); + $courses = Courses_CourseModel::findAllActive(); + $courses->orderBy('getCourseCode'); + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + $root = $dom->createElement('courses'); + $dom->appendChild($root); + + foreach ($courses as $course) { + $courseNode = $dom->createElement('course'); + + $courseNode->appendChild($dom->createElement('title', htmlspecialchars($course->getTitle()))); + + $crosslistings = $course->getCrosslistings(); + if (count($crosslistings) > 0) { + $courseCodesNode = $dom->createElement('courseCodes'); + $courseNode->appendChild($courseCodesNode); + foreach ($crosslistings as $crosslisting) { + $courseCodeNode = $dom->createElement('courseCode'); + $courseCodesNode->appendChild($courseCodeNode); + $courseCodeNode->setAttribute('type', $crosslisting['type']); + $courseCodeNode->appendChild($dom->createElement('subject', $crosslisting['subject'])); + $courseCodeNode->appendChild($dom->createElement('courseNumber', $crosslisting['courseNumber'])); + if ($crosslisting['courseLetter']) { + $courseCodeNode->appendChild($dom->createElement('courseLetter', $crosslisting['courseLetter'])); + } + } + } else { + continue; + } + + $courseNode->appendChild($dom->createElement('gradingType', htmlspecialchars($course->getGradingType(), null, 'UTF-8'))); + $courseNode->appendChild($dom->createElement('dfRemoval', htmlspecialchars($course->getDfRemoval(), null, 'UTF-8'))); + $courseNode->appendChild($dom->createElement('effectiveSemester', htmlspecialchars($course->getEffectiveSemester(), null, 'UTF-8'))); + + if ($node = $this->_getNodeFromHtmlFragment($dom, 'prerequisite', $course->getPrerequisite())) { + $courseNode->appendChild($node); + } + if ($node = $this->_getNodeFromHtmlFragment($dom, 'notes', $course->getNotes())) { + $courseNode->appendChild($node); + } + if ($node = $this->_getNodeFromHtmlFragment($dom, 'description', $course->getDescription())) { + $courseNode->appendChild($node); + } + + if (count($course->getCampuses()) > 0) { + $campusesNode = $dom->createElement('campuses'); + $courseNode->appendChild($campusesNode); + foreach ($course->getCampuses() as $campus) { + $campusesNode->appendChild($dom->createElement('campus', $campus)); + } + } + + if (count($course->getDeliveryMethods()) > 0) { + $deliveryMethodsNode = $dom->createElement('deliveryMethods'); + $courseNode->appendChild($deliveryMethodsNode); + foreach ($course->getDeliveryMethods() as $deliveryMethod) { + $deliveryMethodsNode->appendChild($dom->createElement('deliveryMethod', $deliveryMethod)); + } + } + + if (count($course->getTermsOffered()) > 0) { + $termsOfferedNode = $dom->createElement('termsOffered'); + $courseNode->appendChild($termsOfferedNode); + foreach ($course->getTermsOffered() as $term) { + $termsOfferedNode->appendChild($dom->createElement('term', $term)); + } + } + + $activities = $course->getActivities(); + if (count($crosslistings) > 0) { + $activitiesNode = $dom->createElement('activities'); + $courseNode->appendChild($activitiesNode); + foreach ($activities as $activity) { + $activityNode = $dom->createElement('activity'); + $activitiesNode->appendChild($activityNode); + $activityNode->appendChild($dom->createElement('type', $activity['type'])); + if ($activity['hours']) { + $activityNode->appendChild($dom->createElement('hours', $activity['hours'])); + } + } + } + + $credits = $course->getCredits(); + if (count($credits) > 0) { + $creditsNode = $dom->createElement('credits'); + $courseNode->appendChild($creditsNode); + foreach ($credits as $credit) { + $creditNode = $dom->createElement('credit', $credit['hours']); + $creditsNode->appendChild($creditNode); + $creditNode->setAttribute('type', $credit['description']); + } + } + + $gradTieIn = $course->getGradTieIn(); + if ($gradTieIn['credits']) { + $courseNode->appendChild($dom->createElement('gradCredits', htmlspecialchars($gradTieIn['credits'], null, 'UTF-8'))); + } + if ($node = $this->_getNodeFromHtmlFragment($dom, 'gradNotes', $gradTieIn['notes'])) { + $courseNode->appendChild($node); + } + if ($node = $this->_getNodeFromHtmlFragment($dom, 'gradPrerequisites', $gradTieIn['prerequisites'])) { + $courseNode->appendChild($node); + } + + + $root->appendChild($courseNode); + } + + header('Content-type: text/xml'); + $dom->normalize(); + echo $dom->saveXML(); + } + + protected function _getNodeFromHtmlFragment($dom, $nodeName, $fragment) + { + $fragment = trim($fragment); + if (!$fragment) { + return null; + } + + $node = new DOMDocument('1.0', 'UTF-8'); + $fragment = '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $fragment . '</body>'; + $node = DOMDocument::loadHTML(strtr($fragment, array('&' => '&'))); + if (!$node->documentElement) { + return null; + } + + $node = $dom->importNode($node->documentElement, true); + $realNode = $node->childNodes->item(1); + + $newNode = $dom->createElement($nodeName); + while ($realNode->hasChildNodes()) { + $newNode->appendChild($realNode->childNodes->item(0)); + } + + return $newNode; } /** @@ -25,10 +159,8 @@ class Courses_PublicViewController extends App_Controller_Action { */ public function testAction() { - $layout = Zend_Layout::getMvcInstance(); - $layout->disableLayout(); - $this->getFrontController()->setParam('noViewRenderer', true); - header('Content-type: text/plain'); + $this->_disableLayoutAndView(); + //header('Content-type: text/plain'); $db = Zend_Registry::get('db'); diff --git a/application/modules/courses/models/CourseModel.php b/application/modules/courses/models/CourseModel.php index d0cdbf0b3c4450303a59d11ab7904c10a7a4bd2f..4e68721620ded662ea480f88248ac985018239c6 100644 --- a/application/modules/courses/models/CourseModel.php +++ b/application/modules/courses/models/CourseModel.php @@ -127,6 +127,7 @@ class Courses_CourseModel extends Unl_Model // Credits $select = new Zend_Db_Select($db); $select->from(array('c' => 'creqCourseCredits')); + $select->join(array('t' => 'creqCreditTypes'), 'c.type = t.creditTypeId', array('description')); $select->where('c.generation IN(?)', $courseIds); $records = $select->query()->fetchAll(); @@ -358,7 +359,7 @@ class Courses_CourseModel extends Unl_Model } } - static public function findByCourseCode($subject, $courseNumber, $courseLetter = null) + static public function findByCourseCode($subject, $courseNumber, $courseLetter = '') { $db = Zend_Registry::get('db'); @@ -370,10 +371,8 @@ class Courses_CourseModel extends Unl_Model $select->where('g.removed = "no"'); $select->where('c.subject = ?', $subject); $select->where('c.courseNumber = ?', $courseNumber); - if ($courseLetter) { - $select->where('c.courseLetter = ?', $courseLetter); - } - + $select->where('c.courseLetter = ?', $courseLetter); + $records = $select->query()->fetchAll(); if (count($records) == 0) { return null; @@ -407,6 +406,23 @@ class Courses_CourseModel extends Unl_Model $requests = Requests_RequestModel::find($requestIds); return $requests; } + + static public function findAllActive() + { + $db = Zend_Registry::get('db'); + + $select = new Zend_Db_Select($db); + $select->from(array('g' => 'creqCourseGenerations'), array('courseGenerationId')); + $select->join(array('p' => 'creqCourses'), 'g.courseGenerationId = p.currentGeneration', array()); + $select->where('g.removed = "no"'); + + $records = $select->query()->fetchAll(); + $generationIds = array(); + foreach ($records as $row) { + $generationIds[] = $row['courseGenerationId']; + } + return self::find($generationIds); + } static public function save($models) {