Select Git revision
PublicViewController.php
PublicViewController.php 8.25 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('&' => '&')));
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);
}
}
}