基于数据的Symfony / Form添加属性

enu*_*mag 3 php symfony

在我的一种自定义表单类型中,我需要向该字段添加一个自定义HTML属性。但是,该属性基于数据。因此,我添加了一个事件处理程序,但不确定该如何处理。

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();
    // not sure what to do here.
};
Run Code Online (Sandbox Code Playgroud)

也许应该在其他地方完成。请记住,对于我的用例,我需要最初设置为表单的数据,而不是提交的数据。

编辑:有人要求我提供我想要达到的目标的更多详细信息。基本上,我需要将数据库中的初始数据(在PRE_SET_DATA事件中可用)放入data-*HTML属性,以便javascript可以使用它。

更新:即使几个月后也没有好的答案,所以我认为目前不可能解决这个问题。

Mic*_*bov 5

您可以用新的替换旧的表单元素:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();
    $val = $data['some_field'];
    $options = $form->get('existing_field_name_to_replace')->getConfig()->getOptions();
    $options['attr']['your-attr'] = $val;
    $form->add('existing_field_name_to_replace', 'type', $options);
};
Run Code Online (Sandbox Code Playgroud)

$form->add()替换先前定义的表单字段。但是您也可以使用$form->remove()然后$form->add()

  • 我不知道您有什么,要达到什么目的,但这是满足您要求的正确解决方案。您要使用事件侦听器并更改某些属性。您不能更改字段及其属性,但可以添加新字段来代替旧字段。 (2认同)

Ter*_*oth 0

如果这是一个 HTML 属性,您只能通过编辑视图来完成:

<div {% if form.DATA_FIELD.vars.value == 'foo' %}disabled{% endif %}>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,<div>如果 DATA_FIELD 中的数据值为“foo”,则将禁用该功能。如果您的逻辑比简单的数据属性检查更复杂,您可能需要创建一个树枝扩展。