Cześć,
tworzę swoją pierwszą aplikację przy użyciu Symfony, prosty system quizów dla nauczycieli i uczniów. Prawie cały CRUD działa prawidłowo i jest zaimplementowany, jednak mam problem z zaprogramowaniem widoku quizu dla danego użytkownika.
Wpadłem na pomysł, żeby routing quizu wyglądał następująco: /user/quiz/{id_quizu}/{id_pytania} i o ile takie rozwiązanie jest ok, formularz przy takiej opcji dobrze wysyła dane o udzielonej odpowiedzi przez użytkownika do bazy danych, tak jak chce już dodać funkcję losowania pytań (tak, aby każdy użytkownik miał na start inną kolejność pytań) to formularz wariuje.
- Aplikacja losuje pytanie o treści "Nietoperz to:", użytkownik odpowiada na pytanie
- Po kliknięciu w "Zapisz i przejdź dalej" formularz się wykonuje, ale pojawia się inne wylosowane pytanie o treści "Portret damy z gronostajem namalował:", poprzednia odpowiedź na pytanie nie zostaje dodana do bazy danych ponieważ Symfony zwraca błąd "This value is not valid.".
- Konsola zwraca błąd, że w formularzu w parametrze "choices", odpowiedź o danym value nie istnieje
- Problem nie występuje, jeśli po wykonaniu formularza, aplikacja wylosuje to samo pytanie (wtedy normalnie widać zmianę w bazie danych i zaznaczoną odpowiedź): ale to wynika na razie tylko z faktu, że program nie jest zabezpieczony
Jak mogę sobie z takim czymś poradzić? Czy można jakoś wylosować pytania tylko raz, przy pierwszym wejściu w quiz przez użytkownika? (Może to by rozwiązało problem?). Albo, mam źle skonstruowany ten formularz?
Kontroler:
/**
* @Route("/user/quiz/{id}/{id_question}", name="user_showQuiz")
* @param $id
* @param $id_question
* @param Request $request
* @param Response $response
* @return Response
*/
public function showUserQuiz($id, $id_question, Request $request){
$entityManager = $this->getDoctrine()->getManager();
//Pobranie quizu o danym ID
$quiz = $entityManager->getRepository(Quiz::class)->find($id);
//Pobranie pytań do danego quizu
$question_array = $quiz->getQuizQuestions()->toArray();
//Losowanie pytania
shuffle($question_array );
$questionArray = $question_array[$id_question]->getQuizQuestionOptions()->toArray();
//Przekazanie odpowiedzi do pytania do forma
$formOptions = array(
'questions' => $questionArray,
);
$form = $this->createForm(QuizFormType::class, $question_array[$id_question], $formOptions);
$form->handleRequest($request);
if($form->isSubmitted()) {
$choice = $form->get('text')->getData();
}
return $this->render('user/showQuiz.twig', [
'quizForm'=>$form->createView(),
'questions' => $question_array[$id_question],
]);
}
Formularz:
class QuizFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$arrayAnswersLabels = array();
for($i=0; $i<count($options['questions']); $i++)
$arrayAnswersLabels[$options['questions'][$i]->getText()] = $options['questions'][$i]->getId();
$builder
->add('text', ChoiceType::class, array(
'choices' => $arrayAnswersLabels,
'expanded' => true,
));
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'questions'=>array(),
));
}
}
Schemat bazy danych:
- quiz
- id (PK)
- title
- quiz_question
- id (PK)
- quiz_id (FK)
- text
- quiz_question_option
- id (PK)
- quiz_question_id (FK)
- text
- is_correct
- quiz_user_answer
- id (PK)
- quiz_question_id (FK)
- quiz_question_option_id