Aplikacja w Symfony, Quiz - Problem z formularzem

0

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

error.png
error_2.png

0

Nie wiem o co chodzi bo troche to zagmatwane ale na przykład masz takie coś

    //Pobranie quizu o danym ID
    $quiz = $entityManager->getRepository(Quiz::class)->find($id);
    //Pobranie pytań do danego quizu
     $question_array = $quiz->getQuizQuestions()->toArray();

Jeśli pobierasz już quiz po ID to w modelu quiz powinna byc relacja ktora widac na bazie danych ze masz i powinna byc funckja tam typu
quiz->questions ktora pokazuje ci wszystkie pytania, żebyś nie musiał robić drugiej linijki. a jesli już musisz zrobić linijke $question_array = $quiz->getQuizQuestions()->toArray(); to czemu bierzesz wszystkie pytania jak niżej dajesz ID pytania id_question to znaczy ze mieszasz tablice i potem ten sam numer pytania w quizie pokazuje rozne pytanie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1