/** * @return string * * Отображает чистую форму для заполнения со списком вопросов */ public function actionCreate($id) { $modelAnswerList = $this->findAnswerListModel($id); $modelAnswerList->scenario = 'write-test'; if ($modelAnswerList->status !== 'clear') { Yii::$app->getResponse()->redirect(Url::toRoute(['update', 'id' => $modelAnswerList->id])); } $modelQuestionList = $modelAnswerList->questionList; $modelsQuestion = $modelQuestionList->questions; // если форма отправлена. if ($postData = Yii::$app->request->post()) { $modelsAnswer = Model::createMultiple(Answer::classname(), [], $scenario = ['scenario' => 'create']); Model::loadMultiple($modelsAnswer, $postData); $valid = false; $sumScores = 0; $groupsOfModelsAnswerVariants = $this->getAllAnswerVariantsGroupByQuestionId($modelAnswerList->question_list_id); foreach ($modelsAnswer as $modelAnswer) { $modelAnswer->question_list_id = $modelAnswerList->question_list_id; $modelAnswer->answer_list_id = $modelAnswerList->id; $valid = $modelAnswer->validate(); if (!$valid) { break; } if (isset($groupsOfModelsAnswerVariants[$modelAnswer->question_id]) && isset($groupsOfModelsAnswerVariants[$modelAnswer->question_id][$modelAnswer->answer])) { $score = $groupsOfModelsAnswerVariants[$modelAnswer->question_id][$modelAnswer->answer]->scores; $sumScores += $score; } } //если все ответы на вопросы корректны, сохраняем вопросынй лист и ответы $transaction = \Yii::$app->db->beginTransaction(); if ($valid) { $modelAnswerList->date = date('Y-m-d'); $modelAnswerList->status = 'answered'; $modelAnswerList->scores = $sumScores; $modelAnswerList->author = Yii::$app->user->identity->username; if (($valid = $modelAnswerList->validate()) && $modelAnswerList->save()) { foreach ($modelsAnswer as $modelAnswer) { if (!($valid = $modelAnswer->save())) { break; } } } else { $transaction->rollBack(); } if ($valid) { $transaction->commit(); return $this->redirect(['view', 'id' => $modelAnswerList->id]); } } // если были ошибки то перенаправляем на изменение $transaction->rollBack(); return $this->render('create', ['modelQuestionList' => $modelQuestionList, 'modelAnswerList' => $modelAnswerList, 'modelsQuestion' => $modelsQuestion]); } return $this->render('create', ['modelQuestionList' => $modelQuestionList, 'modelAnswerList' => $modelAnswerList, 'modelsQuestion' => $modelsQuestion]); }
/** * Creates a new QuestionList model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $modelQuestionList = new QuestionList(); // добавляем в объект класса QuestionList данные, пришедние из формы if ($modelQuestionList->load(Yii::$app->request->post())) { // создаются $modelsQuestion = Model::createMultiple(Question::classname()); $modelsAnswerVariant = []; Model::loadMultiple($modelsQuestion, Yii::$app->request->post()); $valid = $modelQuestionList->validate(); $valid = Model::validateMultiple($modelsQuestion) && $valid; $postAnswerVariants = Yii::$app->request->post()['AnswerVariant']; if (isset($postAnswerVariants[0])) { foreach ($postAnswerVariants as $indexQuestion => $answers) { if ($modelsQuestion[$indexQuestion]->type === 'select_one') { foreach ($answers as $indexAnswer => $answer) { $data = []; $data['AnswerVariant'] = $answer; $modelAnswerVariant = new AnswerVariant(); $modelAnswerVariant->load($data); $modelsAnswerVariant[$indexQuestion][] = $modelAnswerVariant; } } } } if ($valid) { $transaction = \Yii::$app->db->beginTransaction(); try { if ($flag = $modelQuestionList->save(false)) { foreach ($modelsQuestion as $indexQuestion => $modelQuestion) { if (!($flag = $modelQuestion->save(false))) { $transaction->rollBack(); break; } else { $modelQuestion->link('questionLists', $modelQuestionList); } if (isset($modelsAnswerVariant[$indexQuestion]) && is_array($modelsAnswerVariant[$indexQuestion])) { foreach ($modelsAnswerVariant[$indexQuestion] as $modelAnswerVariant) { if (!$modelAnswerVariant->answer) { continue; } $modelAnswerVariant->question_id = $modelQuestion->id; if (!($flag = $modelAnswerVariant->save(false))) { break; } } } } } if ($flag) { $transaction->commit(); return $this->redirect(['view', 'id' => $modelQuestionList->id]); } else { $transaction->rollBack(); } } catch (Exception $e) { $transaction->rollBack(); } } } else { return $this->render('create', ['modelQuestionList' => $modelQuestionList, 'modelsQuestion' => empty($modelsQuestions) ? [new Question()] : $modelsQuestions, 'modelsAnswerVariant' => empty($modelsAnswerVariant) ? [[new AnswerVariant()]] : $modelsAnswerVariant]); } }