public function action_add_extra_attempt(array $params) { $params = (object) $params; $test = Model_Test::create(); $result = $test->addExtraAttempt($params->user_id, $params->test_id); $links = Resources_Abstract::getInstance()->links; $link = $links->get('tests.results', array('test_id' => $params->test_id)); $msg = 'Дополнительная попытка добавлена'; $this->flash($msg, $link); }
/** * Отображение доступных для слушателя программ и дисциплин. * Все доступные дисциплины сохраняются в сесиию */ public function action_available() { /* Получаем данные слушателя */ $user = Model_User::create(); $udata = (object) $user->getAuth(); $session = Resources_Abstract::getInstance()->session; unset($session->availDisciplines); $student = Model_Education_Students::create(); $avail_programs = $student->getAvailDisciplinesForPrograms($udata->user_id); $avail_disciplines = $student->getAvailDisciplinesSeparate($udata->user_id); //echo 'Test message in file: '.__FILE__.', on line: '.__LINE__; print_r($avail_programs); //echo 'Test message in file: '.__FILE__.', on line: '.__LINE__; print_r($avail_disciplines); //var_dump ($session->availDisciplines); die(); $this->set('programs', $avail_programs); $this->set('disciplines', $avail_disciplines); $this->render(); }
public function stop($test_id, $answers) { $session = Resources_Abstract::getInstance()->session; $exams =& $session->exams[$test_id]; if (!isset($exams)) { $code = Model_Test_Exception::EXAM_IS_NOT_REGISTERED; throw new Model_Test_Exception($code); } $auth = Resources_Abstract::getInstance()->auth; $question_ids = array_keys($answers); $sec_code = $auth->getExamSecurityCode($test_id, $question_ids); if ($sec_code != $exams['sec_code']) { $code = Model_Test_Exception::EXAM_QUESTIONS_MISMATCHED; throw new Model_Test_Exception($code); } $questions = $this->_getQuestionsById($question_ids); $results = (object) array('correct' => array(), 'incorrect' => array(), 'unanswered' => array(), 'time' => $exams['timer']->stop(), 'passed' => null); $section_id = $exams['section_id']; unset($exams, $session->exams[$test_id]); foreach ($answers as $q_id => $answer) { $q = $questions[$q_id]; if (null === $answer) { $results->unanswered[] = $q_id; continue; } if ($q->isCorrectAnswer($answer)) { $results->correct[] = $q_id; } else { $results->incorrect[] = $q_id; } } $test = (object) $this->get($test_id); $num_errors = sizeof($results->incorrect) + sizeof($results->unanswered); $allowable_errors = self::calcAllowableErrors($test->num_questions, $test->errors_limit); /** * @todo Добавить проверку на количество попыток (можно открыть 10 * окон с тестированием и ограничение не сработает). */ $passed = $num_errors > $allowable_errors ? false : true; $passed &= $results->time > $test->time_limit ? false : true; $results->passed = $passed; /* if ($passed) { $user = Model_User::create(); $udata = (object) $user->getAuth(); $checkpoint = Model_Checkpoint::create(); $checkpoint->setNextSectionPass($udata->user_id, $section_id); } */ $this->_saveExamResults($test_id, $num_errors, $test->num_questions, $results->time, $results->passed); $user = Model_User::create(); $udata = $user->getAuth(); $this->notifyObservers($this->TEST_EVENTS['EVENT_AFTER_PASSED_TEST'], array('testId' => $test_id, 'sectionId' => $section_id, 'userId' => $udata['user_id'], 'passed' => $passed)); return $results; }
/** * Отображение доступных учебных материалов. */ public function action_show(array $params = array()) { $a = Model_Test::create(); $a->test(); $links = Resources::getInstance()->links; if (!isset($params['discipline_id']) || is_int($params['discipline_id'])) { $this->flash('Не указан идентификатор дисциплины', $links->get('student.programs')); } $discipline_id = intval($params['discipline_id']); $user = Model_User::create(); $udata = (object) $user->getAuth(); $session = Resources_Abstract::getInstance()->session; // если данных о доступных дисциплинах нет - вычислить if (!isset($session->availDisciplines)) { $student = Model_Education_Students::create(); $avail_programs = $student->getAvailDisciplinesForPrograms($udata->user_id); $avail_disciplines = $student->getAvailDisciplinesSeparate($udata->user_id); } $discipline_open = in_array($discipline_id, $session->availDisciplines); if ($discipline_open) { // дисциплина доступна $disc = Model_Discipline::create(); $discipline_data = $disc->get($discipline_id); $section = Model_Section::create(); $sections = $section->getAllByDiscipline($discipline_id); $modelApps = Model_Application::create(); $statuses = $modelApps->getAppsStatus($discipline_id, $udata->user_id); //== Model_Application::STATUS_FINISHED; $statusFinished = array_key_exists(Model_Application::STATUS_FINISHED, $statuses); $material = Model_Educational_Materials::create(); $materials = $material->getAllByDiscipline($discipline_id, $statusFinished); $control_work = Model_ControlWork::create(); $tests = $control_work->getTestsByDiscipline($discipline_id); $this->set('discipline', $discipline_data); $this->set('sections', $sections); $this->set('materials', $materials); $this->set('tests', $tests); $this->set('user_id', $udata->user_id); //print_r($materials); $this->render(); } else { $this->flash('Данная дисциплина на данный Вам недоступна. Возможно Вы не полностью оплатили заявку по данной дисциплине или программе, содержащей данную дисциплину, либо вообще не подавали заявку на ее изучение.', $links->get('student.programs'), 5); } }
/** * Получить список доступных отдельных дисциплин для студента * Идентификаторы доступных дисциплин сохраняются в сессии в массив availDisciplines * * @param int $student_id * @return array */ public function getAvailDisciplinesSeparate($student_id) { $result = array(); $disc = Model_Discipline::create(); $session = Resources_Abstract::getInstance()->session; $app = Model_Application::create(); // Получаем список заявок на отдельные дициплины $disc_app = $app->getProcessedAppsForDisciplines($student_id); foreach ($disc_app as $a) { $a['cost'] = null === $a['cost'] ? 0 : $a['cost']; $a['total_sum'] = null === $a['total_sum'] ? 0 : $a['total_sum']; $a['disc_sum'] = $a['cost'] / 100 * $a['coef']; /* Если программа, которой принадлежит дисциплина, платная */ if (Model_Education_Programs::PAID_TYPE_PAID == $a['paid_type']) { /* и статус заявки подобает, */ if (Model_Application::STATUS_SIGNED !== $a['status'] && Model_Application::STATUS_PREPAID !== $a['status'] && Model_Application::STATUS_FINISHED !== $a['status']) { continue; } $active = true; // сохраняем в сессии как доступную $session->availDisciplines[] = $a['object_id']; } elseif (Model_Education_Programs::PAID_TYPE_FREE == $a['paid_type']) { /* и статус заявки подобает, */ if (Model_Application::STATUS_SIGNED !== $a['status'] && Model_Application::STATUS_FINISHED !== $a['status']) { continue; } $active = true; // сохраняем в сессии как доступную $session->availDisciplines[] = $a['object_id']; } /* И заносим её в список доступных */ $disc = array('discipline_id' => $a['object_id'], 'title' => $a['title'], 'app_id' => $a['app_id'], 'disc_sum' => $a['disc_sum'], 'total_sum' => $a['total_sum'], 'active' => $active); $result[] = $disc; } return $result; }