在我的一种自定义表单类型中,我需要向该字段添加一个自定义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可以使用它。
更新:即使几个月后也没有好的答案,所以我认为目前不可能解决这个问题。
您可以用新的替换旧的表单元素:
$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()。
如果这是一个 HTML 属性,您只能通过编辑视图来完成:
<div {% if form.DATA_FIELD.vars.value == 'foo' %}disabled{% endif %}>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,<div>如果 DATA_FIELD 中的数据值为“foo”,则将禁用该功能。如果您的逻辑比简单的数据属性检查更复杂,您可能需要创建一个树枝扩展。