[英]Symfony Form with Form Collection, cannot pass Options array into sub forms
在實體控制器中,創建和編輯使用相同的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,但這是發布/預提交,並提供對數據的訪問權限,我無法強制僅在編輯頁面上禁用字段的輸出。
問題是在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
數組(確保兩個formType都具有帶有選項名稱的setDefaultOptions
函數)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.