Example #1
0
 /** Главный метод: гененрирует полотно вопросов на странице тестов */
 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;
 }
Example #2
0
 /** Генерирует 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);
     // скачать архив
 }