Symfony2 Form FormType本身集合

时间:2013-10-30 09:19:20

标签: php forms symfony

我正在尝试创建一个symfony 2表单'PersonType',它有一个PersonType集合字段,可以映射给定人的孩子。

我收到了这个错误,

{"message":"unable to save order","code":400,"errors":["This form should not contain extra fields."]}

这是我的Person实体,

class Person
{
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Person", mappedBy="parent", cascade={"persist"})
     */
    private $children;

    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="children")
     * @ORM\JoinColumn(name="orderitem_id", referencedColumnName="id", nullable=true)
     */
    private $parent;

}

我的类型,

class PersonType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id')
            ->add('children', 'collection', array(
                'type' => new PersonType()
            ))
        ;
    }

更新:  我已经看到问题是因为选项:

'allow_add' => true,
'by_reference' => false

不在Type中,我删除了它,因为当我插入它们时,表单不会出现,页面崩溃而没有错误。

我很困惑因为这个错误,人们不能生孩子:/

有没有人遇到过同样的问题? (formType嵌套在自身上)

ACUTALLY: 我已将personType复制到PersonchildrenType,以便在第一个...

中插入最后一个

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但错误信息是:

  

FatalErrorException:错误:达到'MAX'的最大函数嵌套级别,正在中止!

这是正常的,因为“PersonType”正在尝试使用新的“PersonType”字段构建表单,该字段也尝试使用新的“PersonType”字段构建表单等等...

因此,目前我设法解决此问题的唯一方法是分两步进行:

  1. 创建父
  2. 创建一个子项并将其“链接”到父项
  3. 您可以在控制器中执行此操作

    public function addAction(Person $parent=null){
        $person = new Person();
        $person->setParent($parent);
    
        $request = $this->getRequest();
        $form    = $this->createForm(new PersonType(), $person);
        if($this->getRequest()->getMethod() == 'POST'){
            $form->bind($request);
    
            if ($form->isValid()) {
                // some code here
                return $this->redirect($this->generateUrl('path_to_person_add', array(
                    'id'    => $person->getId()
                ); //this redirect allows you to directly add a child to the new created person
            }
        }
        //some code here
        return $this->render('YourBundle::yourform.html.twig', array(
            'form'    => $form->createView()
        ));
    }
    

    我希望这可以帮助您解决问题。 如果你不理解某事或者我完全错了,请告诉我;)

答案 1 :(得分:0)

尝试将您的表单注册为服务,如下所述:http://symfony.com/doc/current/book/forms.html#defining-your-forms-as-services,并修改您的表单,如下所示:

class PersonType extends AbstractType
{
    public function getName()
    {
        return 'person_form';
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id')
            ->add('children', 'collection', array(
                'type' => 'person_form',
                'allow_add' => true,
                'by_reference' => false
            ))
        ;
    }
}