/** * Запрещает проходить более одного тренировочного теста одновременно * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if (Session::has('test')) { //если у пользователя есть открытый тест $id_result = Session::get('test'); $query = Result::whereId_result($id_result)->select('saved_test', 'test_name', 'id_test')->first(); $test_name = $query->test_name; $id_test = $query->id_test; $current_test_id = $request->segment(3); if ($id_test != $current_test_id) { //если начатый тест и текущая страничка не совпадает return view('tests.single_test', compact('test_name', 'id_test')); } } return $next($request); }
/** Пользователь отказался от прохождения теста */ public function dropTest() { if (Session::has('test')) { $id_result = Session::get('test'); $date = date('Y-m-d H:i:s', time()); Session::forget('test'); Session::forget('end_time'); Result::whereId_result($id_result)->update(['result_date' => $date, 'result' => -1, 'mark_ru' => -1, 'mark_eu' => 'drop']); //Присваиваем результату и оценке значения -1 } return redirect('tests'); }
/** Проверка теста */ public function checkTest(Request $request) { //обработать ответ на вопрос if (Session::has('test')) { //проверяем повторность обращения к результам $current_test = Session::get('test'); } else { return redirect('tests'); } Session::forget('test'); //тест считается честно пройденым Session::forget('end_time'); $amount = $request->input('amount'); $id_test = $request->input('id_test'); $test = new Test(); $score_sum = 0; //сумма набранных баллов $points_sum = 0; //сумма максимально овзможных баллов $choice = []; //запоминаем выбранные варианты пользователя $j = 1; $query = $test->whereId_test($id_test)->select('total', 'test_name', 'amount', 'test_type')->first(); $total = $query->total; $test_type = $query->test_type; for ($i = 0; $i < $amount; $i++) { //обрабатываем каждый вопрос $data = $request->input($i); $array = json_decode($data); $data = $this->check($array); $right_or_wrong[$j] = $data['mark']; $choice[$j] = $data['choice']; $j++; $score_sum += $data['score']; //сумма набранных баллов $points_sum += $data['points']; //сумма максимально возможных баллов } if ($points_sum != 0) { $score = $total * $score_sum / $points_sum; $score = round($score, 1); } else { $score = $total; } $mark_bologna = $this->calcMarkBologna($total, $score); //оценки $mark_rus = $this->calcMarkRus($total, $score); $result = new Result(); $date = date('Y-m-d H:i:s', time()); //текущее время if ($test_type != 'Тренировочный') { //если тест контрольный $result->whereId_result($current_test)->update(['result_date' => $date, 'result' => $score, 'mark_ru' => $mark_rus, 'mark_eu' => $mark_bologna]); return view('tests.ctrresults', compact('score', 'mark_bologna', 'mark_rus')); } else { //если тест тренировочный $amount = $query->amount; $widgets = []; $query = $result->whereId_result($current_test)->first(); //берем сохраненный тест из БД $saved_test = $query->saved_test; $saved_test = unserialize($saved_test); for ($i = 0; $i < $amount; $i++) { $widgets[] = View::make($saved_test[$i]['view'] . 'T', $saved_test[$i]['arguments'])->with('choice', $choice[$i + 1]); } $result->whereId_result($current_test)->update(['result_date' => $date, 'result' => $score, 'mark_ru' => $mark_rus, 'mark_eu' => $mark_bologna]); $widgetListView = View::make('questions.student.training_test', compact('score', 'right_or_wrong', 'mark_bologna', 'mark_rus'))->with('widgets', $widgets); return $widgetListView; } }