我希望能够动态设置表单字段的required=true/false
选项或array(...other stuff..., 'class' => ' hidden')
。
上下文如下:有一个"项目"有一些领域的实体。当我使用表单创建其他实体时,我想检查项目实体的一些属性,并根据我创建的实体的某些字段的可见性/必要性做出决定。
例如,如果项目具有属性" timePressure = high"然后,不需要给定实体的字段(但是可见)。如果还有其他条件,它会变得不可见等......
所以基本上我希望在表单生成器的每个->add()
内调用一个函数来吐出相关的部分(例如,该函数将返回一个字符串,其中包含" required = true"或者其他与隐藏类相关的)。问题是该函数应该作为参数:projectID(好的,这可以作为表单构建器的选项传递),我们正在讨论的类和字段。我想象的是:
->add('background', 'textarea', array('attr' => array('rows' => 4, functionToDecideIfInvisible($projectId)), functionToDecideRequiredness($projectId)))
这两个函数将返回字符串'class' => ' hidden'
和required=true
(或false)
我希望避免必须指定字段名称(在本例中为background
)以避免代码重复。
可以这样做吗?
关于如何解决问题的其他建议?
谢谢!
SN
答案 0 :(得分:2)
您需要的是表格活动:this answer to a question on Emscripten with module loaders
它们允许您根据数据修改表单。
您在控制器中创建项目表单:
$form = $this->createForm(new ProjectType(), $project, array(
'action' => $this->generateUrl('project.edit'),
'method' => 'POST',
));
然后添加FormEvents :: PRE_SET_DATA侦听器:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$project = $event->getData();
$form = $event->getForm();
// check timePressure on the Project object
if ('high' === $project->timePressure) {
$form->add('timePressure', 'text', array(
'required' => false
);
}
});
}