<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Teacher_Rating extends Controller_UserEnvi { public function before() { Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать отчет TODO $this->model_rating = new Model_Teacher_Rating; $this->model_discipline = new Model_Teacher_Map; parent::before(); } // Получить из кука SGID выбранную ранее группу для данной дисциплины private function getStudyGroupID_ForFilter($id) { # $id = disciplineID $SG_array = json_decode(Cookie::get('SGID', null), true); if ($SG_array !== null && array_key_exists($id, $SG_array)) { return $SG_array[$id]; } return 0; } // Настройки дисциплины и выбранная группа(для фильтра) private function getDisciplineInformation($id) { $temp = $this->model_discipline->getDisciplineInfoByID($id); $disciplineInfo = $temp[0]; $disciplineInfo['ID'] = $id; $disciplineInfo['StudyGroupID_Filter'] = $this->getStudyGroupID_ForFilter($id); return $disciplineInfo; } // Шапка таблицы: структура УКД (модули и мероприятия) private function getStructure($id, $type) { $teacherID = $this->UserInfo['TeacherID']; if ($type == "rating") { $structure = $this->model_rating->getMapForDiscipline($teacherID, $id); } else { $structure = $this->model_rating->GetMapForDisciplineExam($teacherID, $id); } if($structure->count() == 0) { throw HTTP_Exception::factory (404, "Страница не найдена"); } $structureHandled = array(); $maxRate = $i = 0; $temp_moduleID = -1; $try = 0; // try = 1 - экзамен, = 2, 3 - пересдачи foreach($structure as $row) { if($row['ModuleID'] != $temp_moduleID) { ++$i; // todo $temp_moduleID = $row['ModuleID']; $structureHandled[$i]['SubmodulesCount'] = 0; $structureHandled[$i]['MaxRate'] = 0; $structureHandled[$i]['ModuleTitle'] = $row['ModuleName']; $structureHandled[$i]['ModuleType'] = $row['ModuleType']; } $j = $structureHandled[$i]['SubmodulesCount'] += 1; $structureHandled[$i]['MaxRate'] += (int) $row['MaxRate']; $cur_submodule = array(); $cur_submodule = $row; $cur_submodule['MaxRate'] = (int)$cur_submodule['MaxRate']; if ($type == "rating") { $cur_submodule['Title'] = $row['SubModuleName']; $maxRate += $row['MaxRate']; } else { //$type == "exam" if ($row['ModuleType'] == 'extra') { $cur_submodule['Title'] = 'Добор баллов'; $maxRate += $row['MaxRate']; } else { if ($try === 0) { $cur_submodule['Title'] = 'Основная сдача'; } else { $cur_submodule['Title'] = 'Пересдача ' . $try; } $try++; } } $structureHandled[$i][$j] = $cur_submodule; } $structureHandled['ModulesCount'] = $i; $structureHandled['MaxRate'] = (int) $maxRate; return $structureHandled; } private function processGroupInfo($groupInfo) { //GroupID, GroupNum, GradeNum, isAttached etc. $out = $groupInfo; //Формирование заголовка курса $gradeNum = $groupInfo['GradeNum']; if ($groupInfo['Degree'] == 'bachelor') { $out['GradeTitle'] = $gradeNum.' курс'; } else if ($groupInfo['Degree'] == 'specialist') { $out['GradeTitle'] = $gradeNum.' курс'; } if ($groupInfo['Degree'] == 'master') { $out['GradeTitle'] = 'Магистратура, '.$gradeNum.' год'; } //Формирование заголовка группы $out['GroupTitle'] = $out['GradeTitle']." ".$groupInfo['GroupNum']." группа"; return $out; } private function getRatesForRatingPage($info) { $rates = array(); $i_r = 0; $rateResult = 0; foreach($info as $row) { ++$i_r; $cur_rate = array(); $rateResult += $cur_rate['Rate'] = $row['Rate']; $moduleType = $row['ModuleType']; $cur_rate['Type'] = $moduleType; if ($moduleType == 'exam') { $cur_rate['SubmoduleID'] = -1; } else if ($moduleType == 'extra') { $cur_rate['SubmoduleID'] = -2; } else { $cur_rate['SubmoduleID'] = $row['SubmoduleID']; } $rates[$i_r] = $cur_rate; } $rates['RateResult'] = $rateResult; return $rates; } private function correctExtra(&$curStudent, $examType, $lastExtraIndex, $firstEmptyExtraIndex, $totalExtraRate) { $bottomLimit = 0; $maxExtraRate = 0; $topLimit = ($examType == 'exam') ? 38 : 60; if ($curStudent['RateSemesterResult'] >= $bottomLimit && $curStudent['RateSemesterResult'] < $topLimit) // студент задолженик { $maxExtraRate = $topLimit - $curStudent['RateSemesterResult']; } if ($lastExtraIndex >= 0) { $curStudent['Rates'][$lastExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate + $curStudent['Rates'][$lastExtraIndex]['Rate']; } if ($firstEmptyExtraIndex >= 0) { $curStudent['Rates'][$firstEmptyExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate; } } private function getRatesForExamPage(&$curStudent, $rate, $examType, $disciplineID) { $rowIndex = 0; $lastExam = $lastExtraIndex = $lastNilExam = $firstEmptyExtra = -1; $rateExtra = 0; $curStudent['RateSemesterResult'] = 0; foreach($rate as $curRate) { if (($curRate['ModuleType'] == 'exam') or ($curRate['ModuleType'] == 'extra')) { $curStudent['Rates'][$rowIndex] = array(); $curStudent['Rates'][$rowIndex]['SubmoduleID'] = $curRate['SubmoduleID']; $curStudent['Rates'][$rowIndex]['Rate'] = $curRate['Rate']; $curStudent['Rates'][$rowIndex]['ModuleType'] = $curRate['ModuleType']; } switch ($curRate['ModuleType']) { case 'regular': $curStudent['RateSemesterResult'] += $curRate['Rate']; break; case 'exam': if (!is_null($curRate['Rate'])) { if ($lastExam >= 0) { $curStudent['Rates'][$lastExam]['Block'] = 'True'; } $lastExam = $rowIndex; } else { if ($lastNilExam < 0) { $lastNilExam = $rowIndex; } else { $curStudent['Rates'][$rowIndex]['Block'] = 'True'; } } break; case 'bonus': $curStudent['Bonus'] = $curRate['Rate']; break; case 'extra': if ($curRate['Rate']) { if ($lastExtraIndex >= 0) { $curStudent['Rates'][$lastExtraIndex]['Block'] = 'True'; } $lastExtraIndex = $rowIndex; $curStudent['Rate'] += $curRate['Rate']; $rateExtra += $curRate['Rate']; } else { if ($firstEmptyExtra < 0) { $firstEmptyExtra = $rowIndex; } else { $curStudent['Rates'][$rowIndex]['Block'] = 'True'; } } break; default: throw HTTP_Exception::factory (500, "Некорректный тип модуля!"); } $rowIndex++; } $total = $this->model_rating->GetStudentRate($curStudent['ID'], $disciplineID); $total = ($total[0])?$total[0]['Num']:0; if ($total) $total = 0; if ($lastExam >= 0) { $curStudent['RateResult'] += $curStudent['Rates'][$lastExam]['Rate']; } $curStudent['RateResult'] = $total; $this->correctExtra($curStudent, $examType, $lastExtraIndex, $firstEmptyExtra, $rateExtra); } protected function get_edit_rights_for_teacher($teacherID, $disciplineID) // $this->UserInfo['TeacherID']=id { $sql = "SELECT `GetEditRightsForTeacher`('$teacherID', '$disciplineID') AS `Num`;";//"CALL `GetEditRightsForTeacher`('$teacherID', '$disciplineID'); "; $res = DB::query(Database::SELECT, $sql)->execute(); //$row = mysql_fetch_array($res); return $res['Num']; } protected function stub_action($page_type) //$page_type: rating, exam { $twig = Twig::factory("teacher/".$page_type); //TODO: validate twig $disciplineId = $this->request->param('id'); $disciplineInfo = $this->getDisciplineInformation($disciplineId); $structureHandled = $this->getStructure($disciplineId, $page_type); // Студенты и их баллы $students = $this->model_rating->GetStudentsForRating($this->UserInfo['TeacherID'], $disciplineId); $rateHandled = array(); $groupsHandled = array(); $i_g = $i_s = $curGroup = 0; foreach($students as $row) { if ($curGroup !== $row['GroupID']) { $curGroup = $row['GroupID']; $i_g++; $i_s = 0; $rateHandled[$i_g] = $this->processGroupInfo($row); $groupsHandled[$curGroup] = $rateHandled[$i_g]['GroupTitle']; } // Студенты $curStudent = $row; //ID, Name, isAttached $curStudent['RateResult'] = 0; // Баллы студента if ($page_type == "rating") { $rates_raw = $this->model_rating->getMapForStudent($row['ID'], $disciplineId); $rates = $this->getRatesForRatingPage($rates_raw); $curStudent['RateResult'] = $rates['RateResult']; unset($rates['RateResult']); $curStudent['Rates'] = $rates; $rateHandled[$i_g]['Students'][$i_s] = $curStudent; } else { $rate = $this->model_rating->getMapForStudentExam($row['ID'], $disciplineId); $this->getRatesForExamPage($curStudent, $rate, $disciplineInfo['ExamType'], $disciplineId); $rateHandled[$i_g]['Students'][$i_s] = $curStudent; } $i_s++; } $editRights=$this->get_edit_rights_for_teacher($this->UserInfo['TeacherID']=id, $disciplineInfo['ID']); if($editRights == 1) $twig->editRights=$editRights; else $twig->editRights=0; // На вывод $twig->User = $this->UserInfo; $twig->headerRate = $structureHandled; // Шапка таблицы: структура УКД (модули и мероприятия) $twig->rateTable = $rateHandled; $twig->groups = $groupsHandled; $twig->disciplineInfo = $disciplineInfo; $twig->disciplineInfo_JSON = json_encode($twig->disciplineInfo); $this->response->body($twig); } // Страница оценивания в течение семестра public function action_edit() { $this->stub_action("rating"); } // Страница оценивания в сессию public function action_exam() { $this->stub_action("exam"); } }