LLLit: Изучение и практика программирования

Данные отправленной формы Symfony равны NULL

В Symfony я создаю форму с четырьмя возможными вариантами выбора в качестве переключателей. Когда пользователь отправляет форму с выбором, я беру отправленные данные формы (выбор пользователя) и отображаю их в twig. Проблема в том, что иногда данные отправленной формы являются нулевыми, даже если пользователь выбрал радио, а иногда выбранный выбор передается и отображается в twig. Также иногда после получения null в twig и обновления страницы данные отображаются, но это не всегда происходит. Почему это несоответствие? Как я могу это решить? Спасибо

public function playAction(Request $request){
        $data = $this->getDbQuestion();
        $questionData = $data[0];
        $questionID = $questionData->getId();

        dump($questionData);
        $answerData = $data[1];
        dump($answerData);

        $form = $this->createFormBuilder($answerData)
            ->add('answers', EntityType::class, array(
                'class' => 'QuizBundle:Answer',
                'query_builder' => function (EntityRepository $er) use ($questionID) {
                    return $er->createQueryBuilder('a')
                        ->where('a.question = :qID')
                        ->setParameter('qID', $questionID);
                },
                'multiple'=>false,
                'expanded'=>true,
                'error_bubbling' => true,
                'choice_label' => 'answer',
            ))
        ->add('Submit',SubmitType::class, array('label' => 'Send Answer'))
        ->getForm();

        $form->handleRequest($request);
        if($form->isSubmitted() && $form->isValid()) {
            $formData = $form->get('answers')->getData();
            $errors = $form->getErrors();
            return $this->render('QuizViews/correctAnswer.html.twig', array('ss' => $formData, 'errors' => $errors ));
        }

        return $this->render('QuizViews/playQuiz.html.twig', array('form' => $form->createView(),'question' => $questionData));
    }

Сброс отправленных данных формы в ветке

<a href="/quiz/question">
    <input type="button" value="Start Quiz" />
</a>
<br>
FormData Correct {{ dump(ss) }}
Form Errors {{ dump(errors) }}

Данные формы

Нуль в ветке

Ответ пользователя в ветке

Добавление $form->isValid()Я получаю это в ветке, когда ответ не отправлен.

Добавление проверки в форму, в ветке я получаю это

27.06.2016

  • Привет, Отонел. Вы очень близки. Не расстраивайтесь. Попробуйте добавить больше операторов отладки или дампа, чтобы выяснить, что может быть не так. 28.06.2016

Ответы:


1

Рад, что ты продвинулся дальше. Я считаю, что "$formData" возвращается как объект ответа, и все, что вам нужно сделать в twig, это вызвать что-то вроде:

{{ ss.getAnswer }}

Где getAnswer — это метод Entity Answer (я не помню ваш код). Правильные данные формы, которые вы показываете выше, выглядят точно так же, как дамп «объекта». Помните, что вам нужно думать с точки зрения объектов.

Дайте мне знать, если это не сработает.

Изменить № 2.

Попробуйте это изменение:

->add('answers', EntityType::class, array(
        'class' => 'QuizBundle:Answer',
        'query_builder' => function (EntityRepository $er) use ($questionID) {
          return $er->createQueryBuilder('a')
                ->where('a.question = :qID')
                ->setParameter('qID', $questionID);
        },
        'multiple'=>false,
        'expanded'=>true,
        'choice_value' => 'answer',
        'choice_label' => 'answer',
))

Там, где я добавил 'choice_value' => 'answer',, в этом случае «ответ» должен быть значением ответа, хранящимся в объекте ответа.

Изменить № 3. Это странно. Я не уверен, почему это не работает. Вам не нужно передавать $answerData в конструктор. Попробуйте оставить его пустым и давайте изменим его на раскрывающийся список (по умолчанию):

$form = $this->createFormBuilder()
    ->add('answers', EntityType::class, array(
         'class' => 'QuizBundle:Answer',
         'label' => 'Select an Answer',
         'choice_value' => 'answer',
         'choice_label' => 'answer',
    ))

Если это не сработает, значит, что-то еще не так, возможно, ваши Сущности. Это возвращает значение Entity в db для меня.

27.06.2016
  • Привет. Я безуспешно пытался вызвать свой getAnswer() из своего объекта. Я не получаю никаких предложенных методов после точки. (сс.) Также я попробовал $formData = $form-›get('answers')->getData(); $f = $formData->getAnswer(); но я получаю эту ошибку: Ошибка: вызов функции-члена getAnswer() для не-объекта 28.06.2016
  • Вы создали геттеры и сеттеры в Symfony для ответа: php bin/console doctrine:generate:entities AppBundle/Entity/Answer ??? Это автоматически создает их, затем вы можете открыть Answers.php, чтобы увидеть, какие изменения были внесены. Он сохраняет резервную копию файла Answers.php~. 28.06.2016
  • У меня уже были геттеры и сеттеры в моем объекте Answer. Я все равно сделал эту команду в консоли. 28.06.2016
  • Это файл ветки QuizViews/correctAnswer.html.twig, который должен содержать {{ ss.getAnswer }}, потому что вы передаете объект ss в файл ветки в массиве. В качестве альтернативы вы можете передать ответ в массиве так: array('ss' => $formData, 'answer' => $formData->getAnswer()), а затем в своей ветке вы можете распечатать его так: {{ answer }}. 28.06.2016
  • Я пробовал в ветке {{ss.getAnswer}}, а также перед отправкой данных в ветку в контроллере, но, видимо, $formData не является объектом (ошибка в комментарии выше) 28.06.2016
  • Любая идея о том, как исправить? 28.06.2016

  • 2

    Вы пытались проверить, действительна ли ваша форма?

    if($form->isSubmitted() && $form->isValid()) {
    

    Кроме того, установка и отображение ошибок формы может очень помочь, чтобы проверить, что не так, и какая часть вашей формы неверна.

    28.06.2016
  • Я добавил $form->isValid(), и теперь при отправке ответа контроллер пытается снова построить вопрос. Так что моя форма недействительна.. 28.06.2016
  • Я добавил в свой код, чтобы получать ошибки формы и отображать их в twig. При отправке ответа и повторном построении вопроса в ветке ошибок не возникает. Только когда выбор отправлен и выбор правильно отображается в ветке, форма не показывает ошибок. 28.06.2016
  • @Элвин Банк. Я отредактировал код, и теперь у меня есть выпадающий список. Хорошей новостью является то, что выбранный ответ каждый раз правильно отображается в ветке. Единственная проблема в том, что список содержит все ответы из моей базы данных на все вопросы. 29.06.2016
  • @Alvin Bunk Я попробовал код в редактировании № 3, и он отлично работает с раскрывающимся меню, но почему он не работает с переключателями? 30.06.2016
  • Новые материалы

    Создание корзины покупок с помощью Redux-Toolkit
    В этой статье мы рассмотрим, как использовать Redux Toolkit для управления состоянием в приложении React, на примере корзины покупок. Когда я начал использовать инструментарий redux, моя..

    Предварительная обработка данных для машинного обучения
    Предварительная обработка данных включает в себя подготовку данных, включающую интеграцию, очистку, нормализацию и преобразование данных; и задачи по сокращению данных; такие как выбор..

    Различия между обычными функциями и стрелочными функциями с точки зрения «этого»
    Концепции Javascript Различия между обычными функциями и стрелочными функциями с точки зрения «этого» Основное различие между обычными функциями и стрелочными функциями с точки зрения this..

    Python + Flask: раскрытие возможностей веб-разработки
    Привет! Меня зовут Гейб, и я увлечен обучением других Python и машинному обучению. Сегодня я хочу погрузиться в захватывающий мир веб-разработки с помощью Python и Flask. Это тема,..

    Как хранить данные для вашего процесса обработки данных
    Узнайте, как разработать эффективную стратегию хранения данных… Данные - новое масло: Все мы знаем, что в современном мире «данные - это новая нефть». Область науки о данных также является..

    Нужно ли высшее образование, чтобы быть разработчиком программного обеспечения?
    Самый простой ответ: нет. С тех пор, как я поджег операционную систему своего ПК, установив плохо разработанное программное обеспечение со всевозможными ошибками, я знал, что это то, чему я..

    ИИ в бизнесе / Развенчаны самые распространенные мифы
    Поскольку искусственный интеллект (ИИ) становится все более распространенным в деловом мире, вокруг этой технологии возникло множество мифов и заблуждений. Некоторые из этих мифов могут..