假设我有一个这样的简单形式:
class MyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('field', 'text');
// this is select
$builder->add('field2', 'choice', array(
'choices' => array(),
'expanded' => false,
'multiple' => false,
));
}
}
现在我想更新表单提交上的field2
选项。
所以流程是:
field1
并提交表单field2
的值,但这次它会根据field2
提交的值field1
呈现包含field2
选项的表单>
选择field1
的值,并与提交的$form->get('field2')->**update**('choices', array(1=>'test'));
一起填写(在步骤2中填写)1
How to Dynamically Modify Forms Using Form Events
这里他们讨论了如何根据提交的表单添加新字段,但我需要更新已有的字段。所以在事件函数中有类似的东西:
**update**
然而我无法弄清楚如何执行此操作,因为没有函数$builder->get('field2')->remove();
$builder->add('field2', 'choice', array(...));
我可以在这样的表单事件中重新创建field2:
field1
但这似乎不对。
2
在控制器中获取MyType
的值,并将其作为自定义选项传递给我的choices
,并在表单创建期间根据field2
上的$request->query->get('field1');
设置。< / p>
我的问题是,如果我这样做,我必须直接从$form->getData()->getField1()
获取值,这是错误的。我需要让表单处理请求,然后通过DataTransformer
获取值,以便表单有机会处理field1
附加到$entity = new Entity();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
$value = $form->getData()->getField1();
$value
我在控制器中的代码是由symfony2生成的标准代码:
createCreateForm()
现在为时已晚,无法将{{1}}传递给表单构建器,因为表单已在{{1}}中创建
任何想法?
答案 0 :(得分:0)
您可以尝试在第一次尝试的解决方案中替换此块:
$builder->get('field2')->remove();
$builder->add('field2', 'choice', array(...));
通过这个:
$builder->remove('field2');
$builder->add('field2', 'choice', array(...));