是否可以将 PRE_SET_DATA 事件中的自定义数据属性设置为表单标签本身?
Is it possible to set a custom data attribute from whithin a PRE_SET_DATA event to the form tag itself?
我有一个 Blog 实体,它有一个 slug,我想要这个 slug保存在表单标签内的自定义数据属性中,如下所示:<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' ];
}
}
可以在 twig 模板中做几乎相同的事情,例如:{{ form_start(form, { 'attr': { 'data-article-slug' : form.vars.value.slug } }) }}
但我发现这种方式非常冗余而且对 symfony 不友好,我该如何实现?
基本上接下来的思路是:
您需要创建(或您已经拥有)表单类型:
例如
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
属性将被添加到一个表单中。
进一步阅读:
很遗憾,这是不可能的。一旦 $builder->getForm()
被调用,表格就会被锁定。这是设计的一部分,允许在构建后修改表单可能会导致问题,因为必须解决选项,这只能通过表单构建过程来实现。
另外你可以阅读这个:
也许这样: https://github.com/symfony/symfony/issues/20311
我有一个 Blog 实体,它有一个 slug,我想要这个 slug保存在表单标签内的自定义数据属性中,如下所示:<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' ];
}
}
可以在 twig 模板中做几乎相同的事情,例如:{{ form_start(form, { 'attr': { 'data-article-slug' : form.vars.value.slug } }) }}
但我发现这种方式非常冗余而且对 symfony 不友好,我该如何实现?
基本上接下来的思路是: 您需要创建(或您已经拥有)表单类型: 例如
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
属性将被添加到一个表单中。
进一步阅读:
很遗憾,这是不可能的。一旦 $builder->getForm()
被调用,表格就会被锁定。这是设计的一部分,允许在构建后修改表单可能会导致问题,因为必须解决选项,这只能通过表单构建过程来实现。
另外你可以阅读这个: