<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Teacher_Rating extends Controller_UserEnvironment { /** @var Model_Rating */ protected $model_rating; /** @var Model_Map */ protected $model_discipline; public function before() { Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать отчет TODO $this->model_rating = new Model_Rating; $this->model_discipline = new Model_Map; parent::before(); } // Получить из кука SGID выбранную ранее группу для данной дисциплины private function getGroupID_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 getStructure($id, $type) { $teacherID = $this->user['TeacherID']; if ($type == "rating") { $structure = $this->model_rating->getMapForDiscipline($id); } else { $structure = $this->model_rating->GetMapForDisciplineExam($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']; $curStudent['Rates'][$rowIndex]['ExamPeriodOption'] = $curRate['ExamPeriodOption']; } 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; $curStudent['RateResult'] = $curStudent['RateSemesterResult'] + $rateExtra; if ($lastExam >= 0) { $curStudent['RateResult'] += $curStudent['Rates'][$lastExam]['Rate']; } $this->correctExtra($curStudent, $examType, $lastExtraIndex, $firstEmptyExtra, $rateExtra); } protected function get_edit_rights_for_teacher($teacherID, $disciplineID) { // $this->user['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']; } /** * @param $page_type: rating, exam * @throws HTTP_Exception */ protected function stub_action($page_type) { if ($page_type != 'exam' && $page_type != 'rating') throw new RuntimeException('invalid $page_type param'); $id = $this->request->param('id'); $discipline = Model_Discipline::load($id); $discipline['GroupID_Filter'] = $this->getGroupID_ForFilter($id); $discipline['LocalizedExamType'] = DataHelper::LocalizeExamType($discipline->type); // Студенты и их баллы $students = $this->model_rating->GetStudentsForRating($id); $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 = Model_Rating::getRates($id, $row['ID']); $rates = $this->getRatesForRatingPage($rates_raw); $curStudent['RateResult'] = $rates['RateResult']; unset($rates['RateResult']); $curStudent['Rates'] = $rates; $rateHandled[$i_g]['Students'][$i_s] = $curStudent; } else { $rate = Model_Rating::getExamRates($id, $row['ID']); $this->getRatesForExamPage($curStudent, $rate, $discipline->type, $id); $rateHandled[$i_g]['Students'][$i_s] = $curStudent; } $i_s++; } $editRights=$this->get_edit_rights_for_teacher($this->user['TeacherID'], $discipline->ID); // Шапка таблицы: структура УКД (модули и мероприятия) $this->twig->set([ 'groups' => $groupsHandled, 'rateTable' => $rateHandled, 'headerRate' => $this->getStructure($id, $page_type), 'editRights' => (1 == $editRights), 'disciplineInfo' => $discipline, 'disciplineInfo_JSON' => json_encode($discipline), ])->set_filename("teacher/" . $page_type); } // Страница оценивания в течение семестра public function action_edit() { $this->stub_action("rating"); } // Страница оценивания в сессию public function action_exam() { $this->stub_action("exam"); } }