我有博客实体,其中 slug ,我希望将 slug 保存在表单标记内的自定义数据属性中像这样:module.id
。
这是我期望实现的目标:
<form data-article-slug="my-slug">
在树枝模板中可以做几乎相同的事情,例如:class BlogTypeSubscriber implements EventSubscriberInterface
{
public function onPreSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
$slug = $data->getSlug();
if (!empty($slug)) /* the bellow method does not exist */
$form->setAttr([ 'data-article-slug' => $slug ]);
}
public static function getSubscribedEvents()
{
return [ FormEvents::PRE_SET_DATA => 'onPreSetData' ];
}
}
但是我发现这种方式非常冗长而不是symfony友好,我怎么能实现这个目标呢?
答案 0 :(得分:1)
不幸的是,这是不可能的。调用$builder->getForm()
后,表单将被锁定。它是设计的一部分,允许在构建之后修改表单可能会导致问题,因为必须解决选项,这只能通过表单构建过程来实现。
您可以阅读此内容: Symfony 2 - modifying form configuration after initializing a form object 也许这样: https://github.com/symfony/symfony/issues/20311
答案 1 :(得分:0)
基本上这个想法是下一个: 您需要创建(或者您已经拥有)表单类型: 例如
class YourEntityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->setAttribute('somefield')
->setAttribute('slug');
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($builder){
/** @var YOURENTITY $data */
$data = $builder->getData();
if ($data->getSlug()) {
$builder->setAttribute('data-article-slug', $data->getSlug());
}
}
);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => YOURENTITYCLASSNAMEHERE::class]);
}
}
}
因此,在此示例中,我们使用事件侦听器创建了一个实体表单类型。在设置数据时,如果您有slug
,那么data-article-slug
属性将添加到表单中。
进一步阅读: