Проверьте, верна ли установленная радио кнопка - symfony - PullRequest
0 голосов
/ 14 апреля 2019

Здравствуйте, я пытаюсь увидеть (после суммирования с), как я могу проверить, является ли один из 'choices' => $question->buildAnswerWithValidKey() истинным.

Вот массив из вопроса.

Array
(
    [Sonne] => 1
    [Mond] => 
    [Und Sterne] => 
)

И я пытаюсь проверить это после суммирования формы.

Вот моя 'choices' функция.Получает ответы, основываясь на вопросе с правильным ключом (в данном случае 1 или 0, true / false)

 public function buildAnswerWithValidKey()
    {
        $answers = [];
        $valid = [];
        $answersWithValidKey = [];

        /** @var Answer $answer */
        foreach ($this->getAnswers() as $answer) {
            $answers[] = $answer->getAnswer();
            $valid[] = $answer->getValid();
        }

        //Sets answers as item and valid as key as required by 'choices'
        $answersWithValidKey[] = array_combine($answers, $valid);

        return $answersWithValidKey;
    }

Это мой контроллер.Где я пытаюсь проверить переключатель.

        /** @var Question $question */
        $question = $this->questionRepository->findById(12)[0];

        $options = ['question' => $question];

        $form = $this->createForm(ExamType::class, null, $options);
        $form->handleRequest($request);

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

        }

        return [
            'form' => $form->createView(),
        ];

Вот мои другие классы, которые могут быть полезными.

Answer.php - Где сопоставлено ManyToOne.

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\AnswerRepository")
 */
class Answer
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $answer;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="answers")
     * @ORM\JoinColumn(name="question_id", referencedColumnName="id")
     */
    private $question;

    /**
     * @ORM\Column(type="boolean")
     */
    private $valid;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getAnswer(): ?string
    {
        return $this->answer;
    }

    public function setAnswer(string $answer): self
    {
        $this->answer = $answer;

        return $this;
    }

    public function getQuestion(): ?Question
    {
        return $this->question;
    }

    public function setQuestion(?Question $question): self
    {
        $this->question = $question;

        return $this;
    }

    public function getValid(): ?bool
    {
        return $this->valid;
    }

    public function setValid(bool $valid): self
    {
        $this->valid = $valid;

        return $this;
    }
}

И мой Question.php - Где я сделал свою функцию buildAnswerWithValidKey().

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
 */
class Question
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $question;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="question")
     */
    private $answers;

    public function __construct()
    {
        $this->answers = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getQuestion(): ?string
    {
        return $this->question;
    }

    public function setQuestion(string $question): self
    {
        $this->question = $question;

        return $this;
    }

    /**
     * @return Collection|Answer[]
     */
    public function getAnswers(): Collection
    {
        return $this->answers;
    }

    /**
     * Sets the Answers
     *
     * @param mixed $answers
     * @return void
     */
    public function setAnswers($answers)
    {
        $this->answers = $answers;
    }

    public function addAnswer(Answer $answer): self
    {
        if (!$this->answers->contains($answer)) {
            $this->answers[] = $answer;
            $answer->setQuestion($this);
        }

        return $this;
    }

    public function removeAnswer(Answer $answer): self
    {
        if ($this->answers->contains($answer)) {
            $this->answers->removeElement($answer);
            // set the owning side to null (unless already changed)
            if ($answer->getQuestion() === $this) {
                $answer->setQuestion(null);
            }
        }

        return $this;
    }

    public function buildAnswerWithValidKey()
    {
        $answers = [];
        $valid = [];
        $answersWithValidKey = [];

        /** @var Answer $answer */
        foreach ($this->getAnswers() as $answer) {
            $answers[] = $answer->getAnswer();
            $valid[] = $answer->getValid();
        }

        //Sets answers as item and valid as key as required by 'choices'
        $answersWithValidKey[] = array_combine($answers, $valid);

        return $answersWithValidKey;
    }
}

РЕДАКТИРОВАТЬ:

Вот мой ExamType

 <?php

namespace App\Form;

use App\Entity\Question;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ExamType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        /**
         * @var Question $question
         */
        $question = $options['question'];


        $builder
            ->add(
                //Used to check in the validation
                'question',
                HiddenType::class,
                [
                    'data' => $question->getId()
                ]
            )
            ->add(
                'Answers',
                ChoiceType::class,
                [
                    'choices' => $question->buildAnswerWithValidKey(),
                    'expanded' => true,
                    'label' => $question->getQuestion()
                ]
            )
            ->add(
                'Evaluate',
                SubmitType::class
            );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Question::class,
        ]);

        $resolver->setRequired('question');
        $resolver->setAllowedTypes('question', Question::class);


    }
}

В основномя просто хочу вернуть какое-то сообщение, если пользователь выбрал правильный ответ.

1 Ответ

1 голос
/ 14 апреля 2019

Как правило, чтобы извлечь данные из формы, вам нужно вызвать $form->getData() после того, как он обработал запрос и проверил, является ли он действительным.

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { 
    $answerData = $form->getData();              
    if (!empty($answerData['Answers'] )) { 
          // do something useful
    }  
}

однако форма вернет содержимое данныхв соответствии с его методом buildForm (), и объект данных, в который он будет пытаться поместить содержимое, определяется параметром data_class в FormType.Если результаты должны быть возвращены в массиве, data_class должно быть null.(Так что это также должно быть установлено, альтернатива - это объект, который каким-то образом кодирует возвращаемый результат)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...