在Entity控制器中,create和edit使用相同的formType,然后它具有一个字段的定义,该字段是与实体集合的关系。我遇到的问题是我无法找到将$options
数组传递到表单构建器的方法,该表单构建器随后可用于子实体formType。我可以通过formTypes的构造函数传递所有值,但这感觉是一种解决方法而不是解决方案。
我的控制器示例(状态是我希望通过的附加选项);
private function createEditForm(Delivery $entity)
{
$form = $this->createForm(new DeliveryType(), $entity, array(
'state'=>'update', // This is the extra value I wish to pass through.
'action' => $this->generateUrl('delivery_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
$form->add('submit', 'submit', array('label' => 'Update'));
return $form;
}
在表单构建器类中,我将其包含在setDefaultOptions()
中,如此
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\DemoBundle\Entity\Delivery',
'state' => 'create'
));
}
但是在这个formType类中,我找不到一种方法将它传递给实体集合而不使用集合formType的构造函数。我的主要formType类看起来像这样;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'date', array(
'widget' => 'single_text',
'datepicker' => true
))
->add('poNumber')
->add('deliveryItems', 'collection', array(
'type' => new DeliveryItemType($id),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
))
;
}
并且子实体formType看起来像这样;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('stock', 'entity', array(
'class' => 'Acme\DemoBundle\Entity\Stock',
'attr' => array(
'class' => 'chosen'
)
))
->add('quantity')
;
}
我试图指定更新和创建之间的区别的原因是我不必复制formType类文件,只需对每个文件进行一行更改。通过构造函数传递值将起作用,但它不干净或不可维护。另一个可能的选择是通过Twig执行此操作,但我觉得手动输出表单小部件向后退一步。
我理想的解决方案是在编辑控制器/页面上为子实体字段提供自定义状态(禁用),这样一旦创建关系就无法重置,因为这会导致我的代码出现问题。
我也查看了Form EventListeners,但这是post / pre submit并且可以访问数据,我无法强制仅在编辑页面上禁用字段的输出。
答案 0 :(得分:2)
问题是在DeliveryType类中我无法确定如何将选项传递给子formType。这里的信息:http://symfony.com/doc/current/reference/forms/types/collection.html#basic-usage和IRC的一些帮助清理了我所遗漏的内容。
我的主要formType现在在实体集合定义中有一个额外的行;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'date', array(
'widget' => 'single_text',
'datepicker' => true
))
->add('poNumber')
->add('deliveryItems', 'collection', array(
'type' => new DeliveryItemType($id),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'options' => array('state' => $options['state']), // THIS LINE!
))
;
}
这意味着我可以在子formType中调用$options
数组(确保两个formTypes都有setDefaultOptions
函数,并带有选项名称)