php - 使用 FormEvents::POST_SUBMIT 的两个监听器
问题描述
我想根据提交的数据修改一些表单字段,所以在表单类中我做了:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('year', ChoiceType::class, [
'choices' => ['Year' => '-1'] + array_combine(range(date('Y'), date('Y') - 19), range(date('Y'), date('Y') - 19)),
'label' => false,
])
->add('make', ChoiceType::class, ['choices' => ['Make' => '-1'], 'label' => false])
->add('model', ChoiceType::class, ['choices' => ['Model' => '-1'], 'label' => false]);
//...
$builder->get('year')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$year = $event->getForm()->getData();
$makes = $year === '-1' ? ['Make' => '-1'] : $this->customService->getMakes();
$event->getForm()->getParent()
->add('make', ChoiceType::class, ['choices' => $makes, 'label' => false]);
}
);
$builder->get('make')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$make = $event->getForm()->getData();
$models = $make === '-1' ? ['Model' => '-1'] : $this->customService->getModels();
$event->getForm()->getParent()
->add('model', ChoiceType::class, ['choices' => $models, 'label' => false]);
}
);
}
但是,即使我提交了该make
字段,第二个侦听器也不会执行,因此我无法修改该model
字段。任何的想法?
解决方案
问题似乎是在字段事件侦听器中修改make
字段时,永远不会调用字段事件侦听器。我找到了一种让它工作的方法:year
make
private $makes;
private $models;
public function buildForm(FormBuilderInterface $builder, array $options)
{
//...
$builder->get('year')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$year = $event->getForm()->getData();
$this->makes = $year === '-1' ? ['Make' => '-1'] : $this->customService->getMakes();
}
);
$builder->get('make')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$make = $event->getForm()->getData();
$this->models = $make === '-1' ? ['Model' => '-1'] : $this->customService->getModels();
$event->getForm()->getParent()
->add('make', ChoiceType::class, ['choices' => $this->makes, 'label' => false, 'data' => $make]);
}
);
// Same with model field
}
推荐阅读
- javascript - 在后端而不是前端使用 firebase 身份验证
- java - 我是否必须在我的 hql 查询中防御性地保护空值?
- javascript - 尝试显示函数时如何避免未定义的错误?
- google-apps-script - 来自 Google AppScript 的 GetValue() 无法获取带有子域的邮件 (something@mydomain.com.mx)
- c++ - 在未来的共享库加载时使断点挂起?(y 或 [n])
- qt - 在程序运行 Qt 期间对话框窗口冻结
- wordpress - 以编程方式更新 WooCommerce 产品
- javascript - React Native - 动画完成后奇怪的闪烁
- python - pandas 通过检查列表创建一个新列
- android - 如何避免我的 Firebase 云函数中的嵌套承诺