Symfony2动态地将attr分配给表单字段

时间:2015-05-10 15:08:45

标签: symfony symfony-forms

我希望能够动态设置表单字段的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

1 个答案:

答案 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
            );
        }
    });
}