簡體   English   中英

具有Form Collection的Symfony Form,無法將Options數組傳遞到子表單中

[英]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類文件,而只需對每個文件進行一行更改。 通過構造函數傳遞值可以使用,但它不是干凈的或不可維護的。 另一個可能的選擇是通過T​​wig進行此操作,但我認為手動輸出表單小部件會向后退一步。

我的理想解決方案是在“控制器/頁面”編輯器中為子實體字段提供自定義狀態(已禁用),以便一旦創建關系就無法重置該關系,因為這會導致我的代碼出現問題。

我也研究了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM