Symfony 表单中的 3 个相关选择字段
3 dependent choices fields in Symfony forms
我正在努力使 symfony (2.6) 表单具有 3 个相互依赖的选择字段 (select)。所有这些都只是普通的数组选择,而不是实体字段类型。
假设我有这种情况:
第一个字段有选项:
Option A
Option B
Option C
第二个字段根据第一个字段中 select 的内容填充,并且可以有以下选项之一:
Today
Tomorrow
Never
(例如对于 "Option A" 我将有 "Today" 和 "Tomorrow",对于 "Option B" 只有 "Never" 等,但我可以有相同的选择来自第一个字段的不同选项)
然后第 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->add... 中添加它,但我仍然无法从 second_field[ 中获取 first_field 值=37=]听众。
也许有人在某个地方实现了这个特定的东西并且可以分享他的代码? :)
您应该将侦听器添加到父表单并在可调用对象中获取子数据:
$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);
}
);
我正在努力使 symfony (2.6) 表单具有 3 个相互依赖的选择字段 (select)。所有这些都只是普通的数组选择,而不是实体字段类型。
假设我有这种情况:
第一个字段有选项:
Option A
Option B
Option C
第二个字段根据第一个字段中 select 的内容填充,并且可以有以下选项之一:
Today
Tomorrow
Never
(例如对于 "Option A" 我将有 "Today" 和 "Tomorrow",对于 "Option B" 只有 "Never" 等,但我可以有相同的选择来自第一个字段的不同选项)
然后第 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->add... 中添加它,但我仍然无法从 second_field[ 中获取 first_field 值=37=]听众。
也许有人在某个地方实现了这个特定的东西并且可以分享他的代码? :)
您应该将侦听器添加到父表单并在可调用对象中获取子数据:
$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);
}
);