/** Главный метод: гененрирует полотно вопросов на странице тестов */ public function showViews($id_test) { $test = new Test(); $result = new Result(); $user = new User(); $widgets = []; $saved_test = []; $current_date = date('U'); $query = $test->whereId_test($id_test)->select('amount', 'test_name', 'test_time', 'start', 'end', 'test_type')->first(); if ($current_date < strtotime($query->start) || $current_date > strtotime($query->end)) { //проверка открыт ли тест return view('no_access'); } $amount = $query->amount; //кол-во вопрососв в тесте $result->test_name = $query->test_name; $test_time = $query->test_time; $test_type = $query->test_type; if (!Session::has('test')) { //если в тест зайдено первый раз $test = new Test(); $test_controller = new TestController($test); $ser_array = $this->prepareTest($id_test); for ($i = 0; $i < $amount; $i++) { $id = $this->chooseQuestion($ser_array); if (!$test_controller->rybaTest($id)) { //проверка на вопрос по рыбе return view('no_access'); } $data = $this->showTest($id, $i + 1); //должны получать название view и необходимые параметры $saved_test[] = $data; $widgets[] = View::make($data['view'], $data['arguments']); } $start_time = date_create(); //время начала $int_end_time = date_format($start_time, 'U') + 60 * $test_time; //время конца Session::put('end_time', $int_end_time); $query = Result::max('id_result'); //пример использования агрегатных функций!!! $current_result = $query + 1; //создаем строку в таблице пройденных тестов $query2 = $user->whereEmail(Auth::user()['email'])->select('id')->first(); $result->id_result = $current_result; $result->id_user = $query2->id; $result->id_test = $id_test; $result->amount = $amount; $result->save(); $saved_test = serialize($saved_test); Result::where('id_result', '=', $current_result)->update(['saved_test' => $saved_test]); Session::put('test', $current_result); } else { //если была перезагружена страница теста или тест был покинут $current_test = Session::get('test'); $query = $result->whereId_result($current_test)->first(); $int_end_time = Session::get('end_time'); //время окончания теста $saved_test = $query->saved_test; $saved_test = unserialize($saved_test); for ($i = 0; $i < $amount; $i++) { $widgets[] = View::make($saved_test[$i]['view'], $saved_test[$i]['arguments']); } } $current_time = date_create(); //текущее время $int_left_time = $int_end_time - date_format($current_time, 'U'); //оставшееся время $left_min = floor($int_left_time / 60); //осталось минут $left_sec = $int_left_time % 60; //осталось секунд $widgetListView = View::make('questions.student.widget_list', compact('amount', 'id_test', 'left_min', 'left_sec', 'test_type'))->with('widgets', $widgets); $response = new Response($widgetListView); return $response; }