/** Главный метод: гененрирует полотно вопросов на странице тестов */ 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; }
/** Генерирует pdf файлы с тестом с заданным количеством вариантов */ public function pdfTest(Request $request) { $question = new Question(); $test = new Test(); $test_controller = new TestController($test); $question_controller = new QuestionController($question); $test_name = $request->input('test'); $num_var = $request->input('num-variants'); $query = Test::whereTest_name($test_name)->select('amount', 'id_test')->first(); $id_test = $query->id_test; $amount = $query->amount; // кол-во вопрососв в тесте $today = date("Y-m-d H-i-s"); $dir = 'download/pdf_tests/' . $today; mkdir($dir); define('FPDF_FONTPATH', 'C:\\wamp\\www\\uir\\public\\fonts'); for ($k = 1; $k <= $num_var; $k++) { // генерируем необходимое число вариантов $fpdf = new Mypdf(); $answered_fpdf = new Mypdf(); $this->headOfPdf($fpdf, $test_name, $k, $amount); $this->headOfPdf($answered_fpdf, $test_name, $k, $amount); $ser_array = $question_controller->prepareTest($id_test); // подготавливаем тест for ($i = 0; $i < $amount; $i++) { // показываем каждый вопрос из теста $id = $question_controller->chooseQuestion($ser_array); if (!$test_controller->rybaTest($id)) { //проверка на вопрос по рыбе return view('no_access'); } $this->pdfQuestion($fpdf, $id, $i + 1); $this->pdfQuestion($answered_fpdf, $id, $i + 1, true); $fpdf->Ln(10); $answered_fpdf->Ln(10); } $fpdf->Output(iconv('utf-8', 'windows-1251', $dir . '/variant' . $k . '.pdf'), 'F'); $answered_fpdf->Output(iconv('utf-8', 'windows-1251', $dir . '/answered_variant' . $k . '.pdf'), 'F'); } $zip = $this->pdfToZip($dir); // создаем архив $this->delPdf($dir); // удаляем созданную папку с тестами $this->download($zip); // скачать архив }