Skip to content
Snippets Groups Projects
PublicViewController.php 10.00 KiB
<?php

/**
 * PublicViewController
 *
 * @author
 * @version
 */


class Courses_PublicViewController extends App_Controller_Action {
	/**
	 * The default action - show the home page
	 */
	public function allCoursesAction()
    {
    	$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('&' => '&amp;')));
        if (!$node->documentElement) {
        	return null;
        }

        $node = $dom->importNode($node->documentElement, true);
        if (count($node->childNodes->item(1)->childNodes) == 1 && $node->childNodes->item(1)->childNodes->item(0)->nodeName == 'p') {
        	$realNode = $node->childNodes->item(1)->childNodes->item(0);
        } else {
            $realNode = $node->childNodes->item(1);
        }

        $newNode = $dom->createElement($nodeName);
        while ($realNode->hasChildNodes()) {
        	$newNode->appendChild($realNode->childNodes->item(0));
        }

        return $newNode;
	}

	/**
	 * This action syncronizes the qreqCourses.currentGeneration field with data from creqCourseGenerations
	 *
	 */
	public function testAction()
	{
		$this->_disableLayoutAndView();
        //header('Content-type: text/plain');


		$db = Zend_Registry::get('db');

		$sql = 'SELECT * FROM creqCourseGenerations';
		$data = $db->query($sql)->fetchAll();

		$courses = array();
		foreach ($data as $row) {
			$courseId = $row['course'];
			$generationId = $row['courseGenerationId'];
			$courses[$courseId][$generationId] = $row;
		}

		$multipleLatestCount = 0;
		$courseLatest = array();
		foreach ($courses as $courseId => $course) {
			$parent = null;
			$parentIds = array();
			foreach ($course as $generation) {
				if ($generation['parent']) {
				    $parentIds[] = $generation['parent'];
				}
			}
			$latestCount = 0;
			foreach ($course as $generation) {
				if (!in_array($generation['courseGenerationId'], $parentIds)) {
					$latest = $generation;
					$latestCount++;
				}
			}
			if ($latestCount > 1) {
				echo $courseId . ': Multiple Latest! Skipping.' . PHP_EOL;
				$multipleLatestCount++;
				continue;
			}
			if ($latestCount == 0) {
				echo $courseId . ': No Latest! Skipping.' . PHP_EOL;
				continue;
			}
			while ($latest['parent'] && $latest['type'] != 'official') {
				$latest = $course[$latest['parent']];
			}
			if ($latest['type'] != 'official') {
				$latestId = null;
			} else {
				$latestId = $latest['courseGenerationId'];
			}
			$courseLatest[$courseId] = $latestId;
		}
		echo 'Multiple Latest Count: ' . $multipleLatestCount . PHP_EOL;

		foreach ($courseLatest as $courseId => $latestId) {
			$data = array('currentGeneration' => $latestId);
			$where = 'courseId = ' . $courseId;
			$db->update('creqCourses', $data, $where);
		}
	}

	public function searchAction()
	{
        $this->view->colleges = Courses_CourseModel::getCollegeNames();
        $this->view->departments = Courses_CourseModel::getDepartments();
        $this->view->subjects = Courses_CourseModel::getSubjectsFull();
	}

	public function resultsAction()
	{
		$criteria = $this->_getAllParams();
		$in = $criteria;
		$criteria['title'] = $criteria['courseTitle'];
		$courses = Courses_CourseModel::findWithCriteria($criteria);

        $data = new Unl_Model_Collection('Unl_Model_Array');
        foreach ($courses as $requestId => $course) {
        	$aceOutcomes = $course->getAceOutcomes();
        	if (!$aceOutcomes) {
        		$aceOutcomes = array('-');
        	}
            foreach ($aceOutcomes as $aceOutcome) {
                $data[] = new Unl_Model_Array(array(
                    'slo' => substr($aceOutcome['slo'], 3),
                    'courseCode' => $course->getCourseCode(),
                    'college' => $course->getCollege(),
                    'title' => $course->getTitle(),
                    'courseId' => $course->getCourseId(),
                ));
            }
        }
	
        $session = new Zend_Session_Namespace(__CLASS__);
        $sortBy = $session->sortBy;
        if (!Unl_Util::isArray($sortBy)) {
        	$sortBy = array();
        }
        if ($in['sort']) {
        	if (($key = array_search($in['sort'], $sortBy)) !== FALSE) {
        		unset($sortBy[$key]);
        	}
        	$sortBy[] = $in['sort'];
        }
        $session->sortBy = $sortBy;
        
        foreach ($sortBy as $sortKey) {
        	$data->orderBy('get' . $sortKey);
        }
        
        $this->view->data = $data;
        $this->view->criteria = $criteria;
	}

	public function viewAction()
	{
	    $in = $this->_getAllParams();
	    $id = $in['id'];

	    if ($id) {
	        $course = Courses_CourseModel::findByCourseId($id);
	    }

	    $this->view->course = $course;
	}
}