Symfony - 嵌入的表单将不会显示

时间:2013-11-07 13:11:14

标签: symfony doctrine symfony-forms formbuilder

我正在尝试创建一个表单来插入可以包含一个或多个“答案”的“问题”。所以我想为Answer实体添加一个嵌入表单。

它似乎有效,因为我看到了问题表单,但只有字符串“Answers”显示在表单的底部,而不是字段。

这是我的控制器动作:

public function addQuestionAction(Category $category)
{
    $question = new Question(); 
    $form = $this->createForm(new QuestionType(), $question);

    $request = $this->get('request');
    if ($request->getMethod() === 'POST') {
        $form->bind($request);

        $question->setCategory($category);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();          
            $em->persist($question);
            $em->flush();

        return $this->redirect($this->generateUrl('mycategory_questiondisplay',
            array('id' => $question->getId())));
        }
    }
    return $this->render('MyCategoryBundle:Question:add.html.twig',
        array(
            'form' => $form->createView(),
        )); 
}

我的问题类型形式:

<?php

namespace My\CategoryBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class QuestionType extends AbstractType
{

     /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('description')
            ->add('answers', 'collection', array(
                   'type' => new AnswerType(),
                   'allow_add' => true)
            );

    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Iel\CategoryBundle\Entity\Question'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'my_categorybundle_question';
    }
}

我的问题实体:

<?php

namespace My\CategoryBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Question
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="My\CategoryBundle\Entity\QuestionRepository")
 */
class Question
{
    /**
    * @ORM\OneToMany(targetEntity="My\CategoryBundle\Entity\Answer", 
mappedBy="question", cascade={"persist", "remove"})
    */
    private $answers;

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

    public function addAnswer(\My\CategoryBundle\Entity\Answer
    $answer)
    {
        $this->answers[] = $answer;
            $answers->setQuestion($this);
            return $this;
    }

    public function removeAnswer(\My\CategoryBundle\Entity\Answer $answer)
    {
        $this->answers->removeElement($answer);
    }

    public function getAnswers()
    {
        return $this->answers;
    }

    public function setAnswers($answer)
    {
        $this->answer = $answer;

        return $this;
    }

    /**
    * @ORM\ManyToOne(targetEntity="My\CategoryBundle\Entity\Category",
 inversedBy="question")
    * @ORM\JoinColumns({
    *  @ORM\JoinColumn(name="category_id", referencedColumnName="id")
    * })
    */
    private $category;
    /**
    * Set category
    *
    @param My\CategoryBundle\Entity\Category $category
    */
    public function setCategory(\My\CategoryBundle\Entity\Category $category)
    {
        $this->category = $category;
    }
    /**
    * Get category
    *
    @return My\CategoryBundle\Entity\Category
    */
    public function getCategory()
    {
        return $this->category;
    }

    /**
    * Remove categories
    **
    @param My\CategoryBundle\Entity\Category $categories
    */
    public function removeCategory(\My\CategoryBundle\Entity\Category $category)
    {
        $this->categories->removeElement($category);
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text")
     */
    private $description;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set titre
     *
     * @param string $titre
     * @return Question
     */
    public function setTitre($titre)
    {
        $this->titre = $titre;

        return $this;
    }

    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre()
    {
        return $this->titre;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Question
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

最后,答案实体:

<?php

namespace My\CategoryBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Answer
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="My\CategoryBundle\Entity\AnswerRepository")
 */
class Answer
{

    /**
    * @ORM\ManyToOne(targetEntity="My\CategoryBundle\Entity\Question",
inversedBy="answer")
    * @ORM\JoinColumns({
    *  @ORM\JoinColumn(name="question_id", referencedColumnName="id")
    * })
    */
    private $question;
    /**
    * Set question
    *
    @param My\CategoryBundle\Entity\Question $question
    */
    public function setQuestion(\My\CategoryBundle\Entity\Question $question)
    {
        $this->question = $question;
    }
    /**
    * Get question
    *
    @return My\CategoryBundle\Entity\Question
    */
    public function getQuestion()
    {
        return $this->question;
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="answer", type="text", nullable=true)
     */
    private $answer;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set answer
     *
     * @param string $answer
     * @return Answer
     */
    public function setAnswer($answer)
    {
        $this->answer = $answer;

        return $this;
    }

    /**
     * Get answer
     *
     * @return string 
     */
    public function getAnswer()
    {
        return $this->answer;
    }
}

我真的无法找到我的表格中的错误......

1 个答案:

答案 0 :(得分:1)

问题是你的问题还没有任何答案。因此没有形式。尝试

$question = new Question();
$question->addAnswer(new Answer());

这将显示一个空的答案表格。

查看食谱,了解如何使用javascript在浏览器中动态添加答案。