是否可以将自定义数据属性从PRE_SET_DATA事件中设置为表单标记本身?

时间:2017-05-29 23:50:13

标签: symfony symfony-forms

我有博客实体,其中 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友好,我怎么能实现这个目标呢?

2 个答案:

答案 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属性将添加到表单中。

进一步阅读:

1。Array.prototype.forEach

2。forms (see data_class)