/** * @param Form $form */ public function colorSelectFormSubmitted(Form $form) { $values = $form->getValues(); $subquestion = $this->subquestion_service->saveBaseProperties($values); // rekonstrukce puvodnich id_pages $id_page = $this->question_service->get($subquestion->id_question)->id_page; $options = array(); if ($subquestion->id_page_related !== null) { $related = $this->page_service->getRelatedPagesByFilter(new PageRelated(array(PageRelated::IDS_PAGE_RELATED => array($subquestion->id_page_related), \App\Base\Filter::GROUP_BY => true))); if (count($related) === 1 && $related[0] !== null) { $pages = $related[0]->getPagesRelatedAsArray(); $options = array($pages[0]->getPage()->id_page => "", $pages[1]->getPage()->id_page => ""); } } // $pages = $this->page_service->getRelatedPages($id_page); // $options = array($id_page=>"",$pages[0]->id_page); $form->getComponent("id_pages")->setItems($options); $values = $form->getValues(); $subquestion->state = $values->id_pages === (int) $id_page ? \App\Model\Subquestion::STATE_CORRECT : \App\Model\Subquestion::STATE_WRONG; $subquestion->answer = $values->id_pages; $this->subquestion_service->save($subquestion); if ($form['cancel']->isSubmittedBy()) { $this->redirect("Survey:final"); } if ($this->sessionSection->id_respondent === null) { $this->sessionSection->id_question = $subquestion->id_question; $this->redirect("Survey:personal"); } else { $this->redirect("Survey:question"); } }
public function handleChangeState($id_subquestion, $state) { if ($id_subquestion !== null && in_array((int) $state, array(\App\Model\Subquestion::STATE_CORRECT, \App\Model\Subquestion::STATE_ALMOST, \App\Model\Subquestion::STATE_WRONG, \App\Model\Subquestion::STATE_DISQUALIFIED))) { $subquestion = $this->subquestion_service->get($id_subquestion); if ($subquestion !== null) { $subquestion->state = (int) $state; $this->subquestion_service->save($subquestion); $template = $this->createTemplate(); $template->setFile(__DIR__ . "/subquestions/state.latte"); $template->state = $subquestion->state; $template->id_subquestion = $subquestion->id_subquestion; echo $template->render(); } } exit; }
/** * @param \App\Model\Respondent|null $respondent * @return NewQuestion|null */ public function generateNewQuestion($respondent) { $new_question = new NewQuestion(); $options_wireframes = array(\App\Model\Subquestion::QUESTION_TYPE_WIREFRAME => 0, \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_SELECT => 0, \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_REVERSE => 0); $options_colors = array(\App\Model\Subquestion::QUESTION_TYPE_COLOR => 0, \App\Model\Subquestion::QUESTION_TYPE_COLOR_SELECT => 0); $options = $options_wireframes + $options_colors; /** @var string $question_type */ $question_type = null; /** @var \App\Model\Question $question */ $question = null; /** @var \App\Holder\Page $page_holder */ $page_holder = null; $wireframes_ids = array(); if ($respondent !== null) { // nastaveni jazyka do filtru $languages = array(\App\Model\Website::LANGUAGE_CZECH); if ($respondent->english) { $languages[] = \App\Model\Website::LANGUAGE_ENGLISH; } $entity_categories = $this->entity_category_service->getEntityCategoriesByIdRespondent($respondent->id_respondent); $categories = array(); foreach ($entity_categories as $entity_category) { if ($entity_category->period !== \App\Model\EntityCategory::PERIOD_NEVER) { $categories[] = $entity_category->id_category; } } /** @var \App\Holder\Subquestion[] $subquestions */ $subquestions = $this->getSubquestionHoldersByIdRespondent($respondent->id_respondent); $new_question->setRespondentSubquestionsCount(count($subquestions)); $rand = rand(1, 100); $pages_ids_part = array(); $pages_ids = array(); /** Respondent už zodpověděl nějaké otázky */ if (count($subquestions) > 0) { foreach ($subquestions as $holder) { $pages_ids[] = $holder->getPage()->id_page; if ($holder->getWireframe() !== null) { $wireframes_ids[] = $holder->getWireframe()->id_wireframe; } /** Spočítám kolikrát byl který typ otázky použit a později budu upřednosťnovat málo používáné */ $options[$holder->getSubquestion()->question_type]++; if (array_key_exists($holder->getSubquestion()->question_type, $options_wireframes)) { $options_wireframes[$holder->getSubquestion()->question_type]++; } if (array_key_exists($holder->getSubquestion()->question_type, $options_colors)) { $options_colors[$holder->getSubquestion()->question_type]++; } } $pages_ids_part = array_slice($pages_ids, 20); $pages_ids = array_unique($pages_ids); arsort($options); arsort($options_wireframes); arsort($options_colors); /** @var \App\Holder\Subquestion $last_subquestion */ $last_subquestion = end($subquestions); /** Poslední page, pokud byla zodpovězena špatně, jen s jiným typem otázky */ if (($rand >= 1 && $rand <= 30 || $rand >= 50 && $rand <= 79) && ($last_subquestion->getSubquestion()->state === null || $last_subquestion->getSubquestion()->state === \App\Model\Subquestion::STATE_WRONG)) { $cnt = 3; $page_holder = null; while (($page_holder === null || $page_holder->getPage() === null) && $cnt > 0) { $filter = new \App\Filter\Page(); $filter->setIdPage($last_subquestion->getPage()->id_page); $filter->setExcludeIdWireframe($wireframes_ids); /** Byl zobrazen wireframe a page má nadefinované barvy - zobrazí se otázka na barvy */ if ($cnt === 3 && in_array($last_subquestion->getSubquestion()->question_type, array_keys($options_wireframes))) { $question_type = array_rand($options_colors); $filter->setRequiredColor(true); // $filter->setRequiredTextColor(true); } else { if ($cnt === 2 && in_array($last_subquestion->getSubquestion()->question_type, array_keys($options_wireframes)) && $last_subquestion->getWireframe()->image_mode === \App\Model\Wireframe::IMAGE_REMOVE) { $question_type = array_rand($options_wireframes); $filter->setImageMode(\App\Model\Wireframe::IMAGE_BOX); } else { if ($cnt === 1 && in_array($last_subquestion->getSubquestion()->question_type, array_keys($options_wireframes)) && $last_subquestion->getWireframe()->image_mode === \App\Model\Wireframe::IMAGE_BOX) { $question_type = array_rand($options_wireframes); $filter->setImageMode(\App\Model\Wireframe::IMAGE_BLUR); } } } --$cnt; $page_holder = $this->page_service->getPageHolderByFilter($filter); if ($page_holder !== null && $page_holder->getPage() !== null) { $question = $last_subquestion->getQuestion(); } else { $question_type = null; } } } else { if ($rand >= 80 && $rand <= 100 && count($pages_ids_part) > 20) { $filter = new \App\Filter\Page(); $page_id = $pages_ids_part[array_rand($pages_ids_part)]; $filter->setIdPage($page_id); if (in_array($last_subquestion->getSubquestion()->question_type, array_keys($options_wireframes))) { $question_type = key($options_colors); $filter->setRequiredColor(true); $filter->setRequiredTextColor(true); } else { $question_type = key($options_wireframes); } $page_holder = $this->page_service->getPageHolderByFilter($filter); } else { if ($rand >= 31 && $rand <= 49) { $page_holder = $this->page_service->getPageHolderByFilter(new \App\Filter\Page(array(\App\Filter\Page::PRIORITY => true, \App\Filter\Page::EXCLUDE_ID_PAGE => $pages_ids))); $question_type = key($options_wireframes); } } } /** Náhodná page dle nastavení respondenta */ if (($page_holder === null || $page_holder->getPage() === null) && count($categories) > 0) { $page_holder = $this->page_service->getPageHolderByFilter(new \App\Filter\Page(array(\App\Filter\Page::EXCLUDE_ID_PAGE => $pages_ids, \App\Filter\Page::LANGUAGES => $languages, \App\Filter\Page::CATEGORIES => $categories))); $question_type = array_rand($options_wireframes); } } /** * Respondent ještě nezodpověděl žádné otázky a nebo se dosud nepodařilo vybrat otázku * Zobrazit pouze prioritní pages, odfiltrovat X posledních pages, respektovat nastavení respondenta */ if ($page_holder === null || $page_holder->getPage() === null) { $page_holder = $this->page_service->getPageHolderByFilter(new \App\Filter\Page(array(\App\Filter\Page::PRIORITY => true, \App\Filter\Page::EXCLUDE_ID_PAGE => $pages_ids, \App\Filter\Page::LANGUAGES => $languages, \App\Filter\Page::CATEGORIES => $categories))); $question_type = array_rand($options_wireframes); } } /** * Ještě neznáme respondenta nebo se dosud nepodařilo vybrat otázku * Náhodná prioritní page s náhodným typem otázky, kromě otázek na barvy */ if ($page_holder === null || $page_holder->getPage() === null) { $page_holder = $this->page_service->getPageHolderByFilter(new \App\Filter\Page(array(\App\Filter\Page::PRIORITY => true, \App\Filter\Page::EXCLUDE_ID_WIREFRAME => $wireframes_ids, \App\Filter\Page::EXCLUDE_ID_PAGE => $pages_ids))); $question_type = array_rand($options_wireframes); } if ($page_holder !== null) { $subquestion = new \App\Model\Subquestion(); // $related = $this->page_service->getRelatedPagesHolders($page_holder); $related_holder = $this->page_service->getRelatedPagesByFilter(new PageRelated(array(\App\Base\Filter::LIMIT => 1, \App\Filter\PageRelated::IDS_PAGE => array($page_holder->getPage()->id_page), \App\Filter\Page::PAGE_VISIBLE => true))); /** * Pokud by se stalo, že je vybraný typ otázky, který potřebuje podobné příbuzné stránky z výběru, a aktuální page je nemá */ if (count($related_holder) === 1 && $related_holder[0] !== null && ($question_type === \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_REVERSE || $question_type === \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_SELECT || $question_type === \App\Model\Subquestion::QUESTION_TYPE_COLOR_SELECT)) { $new_question->setPageRelated($related_holder[0]); $subquestion->id_page_related = $related_holder[0]->getPageRelated()->id_page_related; } else { if ($question_type === \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_REVERSE || $question_type === \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME_SELECT) { $question_type = \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME; } else { if ($question_type === \App\Model\Subquestion::QUESTION_TYPE_COLOR_SELECT) { $question_type = \App\Model\Subquestion::QUESTION_TYPE_COLOR; } } } if ($question === null) { $question = new \App\Model\Question(); if ($respondent !== null) { $question->id_respondent = $respondent->id_respondent; } $question->id_page = $page_holder->getPage()->id_page; $this->save($question); } if ($question_type === null) { $question_type = \App\Model\Subquestion::QUESTION_TYPE_WIREFRAME; } $subquestion->id_question = $question->id_question; $subquestion->question_type = $question_type; if ($page_holder->getCurrentWireframe() !== null) { $subquestion->id_wireframe = $page_holder->getCurrentWireframe()->id_wireframe; } $this->subquestion_service->save($subquestion); $new_question->setQuestion($question); $new_question->setSubquestion($subquestion); $new_question->setPageHolder($page_holder); $new_question->setQuestionType($question_type); // $new_question->setPagesHolders($related); return $new_question; } else { return null; } }