【发布时间】:2012-10-30 13:57:20
【问题描述】:
场景:我有一个包含 2 个选择的表单。当用户从第一个选择中选择某些内容时,第二个选择会填充新值。这部分工作正常。
但是表单没有得到验证,因为它包含一些初始表单中不允许的选项。
表格:
<?php
class MyType extends AbstractType
{
private $category;
public function __construct($category = null)
{
$this->category = $category;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
);
$builder->add('template', 'choice', array(
'choices' => $this->loadChoices()
);
}
private function loadChoices()
{
// load them from DB depending on the $this->category
}
}
最初的类别是foo。因此 foo 的模板被加载并设置为选项。但是如果用户选择bar,就会加载条形模板。但是表单仍然有 foo 选项并且不验证。
解决这个问题的最佳方法是什么?
我发现的一种方法是在控制器中重新启动表单:
<?php
$form = $this->createForm(new MyType());
if ($request->getMethod() === 'POST') {
if ($request->request->has($form->getName())
&& isset($request->request->get($form->getName())['category'])) {
$form = $this->createForm(new MyType($request->request->get($form->getName())['category']));
}
// ...
}
这可行,但我无法对其进行测试,因为它在设置值时会抛出 IllegalArgumentException 并假设为默认值。有没有更好的解决方案?提前致谢!
【问题讨论】:
-
您是否尝试为您必须验证的每组选项设置验证组?然后,您只能在与您相关的组上调用验证器服务。 symfony.com/doc/2.0/book/forms.html#validation-groups