繁体   English   中英

表单不会在Symfony 4中呈现OneToMany关系的字段

[英]Form does not render fields of OneToMany relation in Symfony 4

我尝试用一​​对多的关系进行渲染,但是有些字段不渲染。

AnswerType表格

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('text', TextType::class, array('attr' => array('class' => 'form-control'), 'label' => false))
            ->add('isCorrect', CheckboxType::class, array('attr' => array('class' => 'form-control'), 'label' => false))
        ;
    }

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

QuestionAnswerType表单。

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', EntityType::class, array(
                'class' => Question::class,
                'choice_label' => 'title',
            ));
        $builder
            ->add('answers', CollectionType::class, array(
                'entry_type' => AnswerType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true,
            ));
    }

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

控制器片段。

  $question = new Question();
  $form1 = $this->createForm(QuestionAnswerType::class, $question);
  $form1->handleRequest($request);

return $this->render('admin/admin.html.twig',[
            'formAnswer' => $form1->createView(),
        ]);

实体Question

class Question
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
/**
 * @ORM\Column(type="text")
 */
private $title;

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

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

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

public function getTitle(): ?string
{
    return $this->title;
}

public function setTitle(string $title): self
{
    $this->title = $title;

    return $this;
}


/**
 * @return Collection|Answer[]
 */
public function getAnswers(): Collection
{
    return $this->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);
        if ($answer->getQuestion() === $this) {
            $answer->setQuestion(null);
        }
    }

    return $this;
}
}

实体Answer

class Answer
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
/**
 * @ORM\Column(type="text")
 */
private $text;

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

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="answers")
 * @ORM\JoinColumn(nullable=false)
 */
private $question;

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

public function getText(): ?string
{
    return $this->text;
}

public function setText(string $text): self
{
    $this->text = $text;

    return $this;
}

public function getIsCorrect(): ?bool
{
    return $this->is_correct;
}

public function setIsCorrect(bool $is_correct): self
{
    $this->is_correct = $is_correct;

    return $this;
}

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

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

    return $this;
}
}

在树枝上

<div class="tab-pane fade" id="answer" role="tabpanel" aria-labelledby="answer-tab">
                {{ form_start(formAnswer) }}
                {{ form_row(formAnswer.title) }}
                <h3>Answers</h3>
            <ul class="answers">
                {% for answers in formAnswer.answers %}
                    <li>{{ form_row(answers.text) }}</li>
                {% endfor %}
            </ul>
            {{ form_end(formAnswer) }}
        </div>

它看起来像它的外观

Answer

 +-------------+------------+------+-----+---------+----------------+
    | Field       | Type       | Null | Key | Default | Extra          |
    +-------------+------------+------+-----+---------+----------------+
    | id          | int(11)    | NO   | PRI | NULL    | auto_increment |
    | question_id | int(11)    | NO   | MUL | NULL    |                |
    | text        | longtext   | NO   |     | NULL    |                |
    | is_correct  | tinyint(1) | NO   |     | NULL    |                |
    +-------------+------------+------+-----+---------+----------------+

PS最近,我问了很多关于symfony的问题,对不起。 我只想非常了解它。

渲染问题似乎是您的Question缺少的Answer实例。 反过来,您的表单不会呈现任何子表单,因为它没有要呈现的任何内容。 您可以通过添加答案实例来解决此问题,如下所示:

// First, the question
$question = new Question();

// Then, some answers
$question->addAnswer(new Answer());
$question->addAnswer(new Answer());
$question->addAnswer(new Answer());

// Lastly, the form
$form1 = $this->createForm(QuestionAnswerType::class, $question);

这应该够了吧...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM