/** * Декодирует кодовую структуру теста * Возвращает двумерный массив, где по i идут различные структуры вопросов, j=0 - количество вопросов данной структуры, j=1 - сам код вопроса */ public function destruct($id_test) { $test = new Test(); $query = $test->whereId_test($id_test)->select('structure')->first(); $structure = $query->structure; $destructured = explode(';', $structure); $array = []; for ($i = 0; $i < count($destructured); $i++) { $temp_array = explode('-', $destructured[$i]); for ($j = 0; $j <= 1; $j++) { $array[$i][$j] = $temp_array[$j]; } } return $array; }
/** Проверка теста */ 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; } }