public function executeCritique(sfWebRequest $request) { $this->buildSubmenu($request); $id = $request->getParameter("id"); $conn = Propel::getConnection(); $this->courseObj = CoursePeer::retrieveByPK($id, $conn); if ($request->hasParameter("year") && trim($request->getParameter("year")) != "") { $year = $request->getParameter("year"); // check if the year exists $yearArray = AutoCourseRatingPeer::getAvailableYearsForCourseId($id, $conn); $err = true; foreach ($yearArray as $y) { if ($year == $y) { $err = false; break; } } if ($err) { $this->forward404(); } $this->year = $year; $this->instructorArr = CourseInstructorAssociationPeer::getInstructorsForCourseAndYear($id, $year, $conn); if ($request->hasParameter("instructor")) { $insId = $request->getParameter("instructor"); } else { $insId = $this->instructorArr[0]->getId(); } $this->currInstructor = InstructorPeer::retrieveByPK($insId, $conn); // note that the below logic is predicated on getCourseDataArrayForCourseAndInstructorAndYear // sorting by Field, Id, Rating, in the respective order $dataObjArr = AutoCourseRatingPeer::getCourseDataArrayForCourseAndInstructorAndYear($id, $insId, $year, $conn); // $dataArr is an array of dictionaries (arr) that contain ratings/info $this->dataArr = array(); // $arr = dictionary $arr = array(); foreach ($dataObjArr as $obj) { // this sytem does not differentiate between different sections // when multiple sections with the SAME instructor is encountered, the data are aggregated switch ($obj->getFieldId()) { case RatingFieldPeer::NUMBER_ENROLLED: // number enrolled, special field if (isset($this->numberEnrolled)) { $this->numberEnrolled += $obj->getNumber(); } else { $this->numberEnrolled = $obj->getNumber(); } break; case RatingFieldPeer::NUMBER_RESPONDED: // number responded, special field if (isset($this->numberResponded)) { $this->numberResponded += $obj->getNumber(); } else { $this->numberResponded = $obj->getNumber(); } break; case RatingFieldPeer::RETAKE: // percent retake if (isset($this->retake)) { $this->retake += $obj->getNumber(); } else { $this->retake = $obj->getNumber(); } break; default: // ordinary rating data if (!isset($currentNode)) { $currentNode = $obj->getFieldId(); $arr["type"] = $obj->getRatingField()->getRatingTypeString($conn); $arr["field"] = $obj->getRatingField()->getDescr(); $arr["instructor"] = $obj->getCourseInstructorAssociation($conn)->getInstructor()->getLastName(); $arr["typeObj"] = $obj->getRatingField()->getEnumItem($conn); } if ($currentNode != $obj->getFieldId()) { $arr = $this->setMeanAndMedian($arr); $arr["chart"] = $this->getFusionChartFromDataArr($arr); $this->dataArr[] = $arr; unset($arr); $currentNode = $obj->getFieldId(); $arr["type"] = $obj->getRatingField()->getRatingTypeString($conn); $arr["field"] = $obj->getRatingField()->getDescr(); $arr["instructor"] = $obj->getCourseInstructorAssociation($conn)->getInstructor()->getLastName(); $arr["typeObj"] = $obj->getRatingField()->getEnumItem($conn); } if (isset($arr[$obj->getRating()])) { $arr[$obj->getRating()] += $obj->getNumber(); } else { $arr[$obj->getRating()] = $obj->getNumber(); } break; } } // for the last critique field $arr = $this->setMeanAndMedian($arr); // $arr["NA"] = number who did not respond to this question $arr["chart"] = $this->getFusionChartFromDataArr($arr); $this->dataArr[] = $arr; $this->aggregatedRating = $this->calcAggregatedRating($this->dataArr); } else { $this->forward404(); } }