Symfony表单中的3个相关选项字段

时间:2016-02-23 10:01:31

标签: symfony symfony-forms

我正在尝试使用symfony(2.6)表单,其中3个选项字段(select)相互依赖。所有这些都只是普通的数组选择,而不是实体字段类型。

假设我有这种情况:

第一个字段有选项:

Option A
Option B
Option C

根据第一个字段中选择的内容填充第二个字段,可以使用以下选项之一:

Today
Tomorrow
Never

(例如“选项A”我将有“今天”和“明天”,“选项B”只有“从不”等,但我可以从第一个字段中选择不同的选项)

然后第3个字段还有一些其他选项依赖于第1和第2个字段(同样,可以为不同的第1和第2个字段设置一些选项)。

我根据Symfony Cookbook中的这篇文章继续 - http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data - 这几乎与我想要达到的目标相同,但我没有实体,我需要第三场。

我有类似的东西

<?php
...

$builder
    ->add(
        'first_field',
        'choice',
        [
            'choices' => [some choices],
            'placeholder' => 'Choose!',
        ]
    );

$formModifier = function (FormInterface $form, $firstFieldValue) {
    $choices = $firstFieldValue ? $this->getChoices($firstFieldValue) : [];

    $form->add(
        'second_field',
        'choice',
        [
            'choices' => $choices,
            'disabled' => empty($choices),
        ]
    );

    ... here would be "third_field" ...
};

$builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    function (FormEvent $event) use ($formModifier) {
        /** @var FormData $data */
        $data = $event->getData();
        $form = $event->getForm();

        $formModifier($form, $data->getProductId());
    }
);

$builder->get('first_field')->addEventListener(
    FormEvents::POST_SUBMIT,
    function (FormEvent $event) use ($formModifier) {
        $firstFieldValue = $event->getForm()->getData();

        $formModifier($productIdForm->getParent(), $firstFieldValue);
    }
);

$builder->get('second_field')->addEventListener(
    FormEvents::POST_SUBMIT,
    function (FormEvent $event) use ($formModifier) {
        $secondFieldValue = $event->getForm()->getData();

        // ---------------------------------------------
        // My problem is that I need "firstFieldValue"
        // here as well, because I need to generate
        // choices according to 1st and 2nd field values
        // ---------------------------------------------
        $formModifier($productIdForm->getParent(), $secondFieldValue);
    }
);

另一个问题是我无法在 second_field 上附加事件监听器,因为我没有它,它被添加到那些监听器中(但可能我可以直接在$ builder-中添加它) &gt;添加...,但我仍然无法从 second_field 监听器获得 first_field 值。

也许有人在某处实现了这个特定的东西并且可以分享他的代码? :)

1 个答案:

答案 0 :(得分:3)

您应该将侦听器添加到父表单并在callable中获取子数据:

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function (FormEvent $event) use ($formModifier) {
        $form = $event->getForm();
        $firstFieldValue = $form()->get('first_field')->getData();
        if ('something' === $firstFieldValue) {
            $formModifier($form, $firstFieldValue);
        } else {
            $form->remove('second_field');
            // or
            $form->get('second_field')->setData(null);
        }
    }
);

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function (FormEvent $event) use ($formModifier) {
        $secondFieldValue = $event->getForm()->get('second_field')->getData();
        $formModifier($event->getForm(), $secondFieldValue);
    }
);