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

Symfony表单中的3个相关选项字段,symfony,symfony-forms,Symfony,Symfony Forms,我正试图实现symfony 2.6表单,其中包含3个相互依赖的选择字段。所有这些都只是简单的数组选择,而不是实体字段类型 假设我有这种情况: 第一个字段具有以下选项: Option A Option B Option C 第二个字段根据第一个字段中选择的内容填充,可以有以下选项之一: Today Tomorrow Never 例如,对于选项A,我将有今天和明天,对于选项B,只有从不等,但我可以有相同的选择,从第一个字段不同的选项 然后第三个字段有一些其他选项,取决于第一个和第二个字段,同样,

我正试图实现symfony 2.6表单,其中包含3个相互依赖的选择字段。所有这些都只是简单的数组选择,而不是实体字段类型

假设我有这种情况:

第一个字段具有以下选项:

Option A
Option B
Option C
第二个字段根据第一个字段中选择的内容填充,可以有以下选项之一:

Today
Tomorrow
Never
例如,对于选项A,我将有今天和明天,对于选项B,只有从不等,但我可以有相同的选择,从第一个字段不同的选项

然后第三个字段有一些其他选项,取决于第一个和第二个字段,同样,可以为不同的第一+第二组合设置一些选项

我是根据Symfony烹饪书上的这篇文章进行的- -这几乎和我想要实现的一样,但我没有实体,我需要第三个字段

我吃过类似的东西

<?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);
    }
);
另一个问题是,我无法在第二个\u字段上附加事件侦听器,因为我没有它,它被添加到这些侦听器中,但我可能可以直接添加到$builder->add…,但我仍然无法从第二个\u字段侦听器获取第一个\u字段的值


也许有人在某处实现了这个特定的东西,并可以共享他的代码

您应该将侦听器添加到父窗体,并在可调用窗体中获取子数据:

$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);
    }
);

这里的问题是,在POST_SUBMIT中,我无法再添加子项,所以$formModifier函数将失败,而PRE_SUBMIT字段的日期尚未设置日期。是的PRE_SUBMIT事件保存发送的字符串数据,可能足以处理您的内容。很好,它现在部分工作:但假设我填充了所有3个选项,这意味着我在第一个字段中选择了一些内容,在第二个字段中选择了一些内容,现在我再次更改第一个字段,然后它提交所有3个字段,但我需要清除第二个和第三个字段,因为第一个字段发生了变化,但我不知道哪个字段发生了变化。老实说,我现在真的记不起来了:但它确实帮助我找到了解决方案。我再也无法访问该代码了,对不起,所以我接受这一正确答案