我正在尝试创建一个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,以便在第一个...
中插入最后一个答案 0 :(得分:1)
我遇到了同样的问题,但错误信息是:
FatalErrorException:错误:达到'MAX'的最大函数嵌套级别,正在中止!
这是正常的,因为“PersonType”正在尝试使用新的“PersonType”字段构建表单,该字段也尝试使用新的“PersonType”字段构建表单等等...
因此,目前我设法解决此问题的唯一方法是分两步进行:
您可以在控制器中执行此操作
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
))
;
}
}