【问题标题】:Symfony Form with Form Collection, cannot pass Options array into sub forms带有表单集合的 Symfony 表单,无法将选项数组传递给子表单
【发布时间】:2014-10-11 09:40:30
【问题描述】:

在实体控制器中,创建和编辑使用相同的表单类型,然后定义一个与实体集合相关的字段。我遇到的问题是我找不到将$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 并且可以访问数据,我无法强制仅在编辑页面上禁用字段的输出。

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    问题是在 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 函数)

    【讨论】:

    • 在较新的 SF 版本中已更改为 entry_options
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2023-03-19
    • 2012-08-12
    相关资源
    最近更新 更多