2017-05-29 27 views
1

我有谁拥有一个博客实体,我想这被保存在这样的形式标记内自定义数据属性:<form data-article-slug="my-slug">是否可以将PRE_SET_DATA事件中的自定义数据属性设置为表单标记本身?

这是我所期望实现的:

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' ]; 
    } 
} 

这是可以做到的树枝模板,如内几乎同样的事情:{{ form_start(form, { 'attr': { 'data-article-slug' : form.vars.value.slug } }) }}但我觉得这种方式非常redundent而不是Symfony的友好,我怎么能做到这一点?

+0

你有表单类型?请展示它 –

回答

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. forms (see data_class)

2. pre set data event

相关问题