2017-05-29 23 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

相關問題