gpt4 book ai didi

Symfony2 - 递归显示表单

转载 作者:行者123 更新时间:2023-12-02 01:34:25 24 4
gpt4 key购买 nike

大家好(请原谅我的英语)。

我想做一个应用程序,需要允许用户必须在表格上填写他们的个人数据、他们的 child 、孙子和曾孙(一个小家谱)。

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

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

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

/**
* @var \DateTime
*
* @ORM\Column(type="datetime")
*/
private $dateOfBirth;

/**
* @var Person
*
* @ORM\ManyToMany(targetEntity="Person")
*/
private $children;


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

}
}

在 PersonType 类中,我执行以下操作:

class PersonType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstname');

$builder->add('lastname');

$builder->add('dateOfBirth');

$builder->add('children', 'collection', array(
'type' => new PersonType(),
'allow_add' => true,
'by_reference' => false,)
);
}

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

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

这样,我在 Controller 中使用PersonType,如下所示:

public function newAction()
{
$entity = new Person();
$form = $this->createForm(new PersonType(), $entity, array(
'action' => $this->generateUrl('person_create'),
'method' => 'POST',
));

return array(
'entity' => $entity,
'form' => $form->createView(),
);
}

但是问题是当我请求这个 Action 的url,并且这个 Action 的 View 必须被渲染时,就会出现问题,因为没有给出响应,因为它处于无限循环中(我认为这是原因)。我想知道是否可以使用 Symfony 表单来完成此操作,或者我是否必须考虑其他替代方案。如果这是可能的,我怎样才能做到这一点以及如何将表单限制为仅渲染我需要的四个级别(我,我的 child ,我的孙子和我的曾孙)??

我希望问题已被理解。

提前致谢。

最佳答案

您可以向表单添加一个自定义参数来指示当前的递归级别。要存档此内容,您首先需要实现一个新选项:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Anything\YourBundle\Entity\Person',
'recursionLevel' => 4
));
}

现在您可以在 buildForm 方法中更新此值:

public function buildForm(FormBuilderInterface $builder, array $options)
{
// ...
if (--$options['recursionLevel'] > 0) {
$resolver = new OptionsResolver();
$resolver->setDefaults(
$options
);
$childType = new PersonType();
$childType->setDefaultOptions($resolver);

$builder->add('children', 'collection', array(
'type' => $childType,
'allow_add' => true,
'by_reference' => false
));
}
}

这尚未经过测试。

关于Symfony2 - 递归显示表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22877230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com