2014-03-04 32 views
2

創建formType類沒有data_class:

$resolver->setDefaults(array(
     // 'data_class' => 'Mj\JobBundle\Entity\Ads', **i comment this** 
)); 

首先是真的嗎?

和當我使用事件訂戶:

$builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function(FormEvent $event) use ($formModifier) { 
      $data = $event->getData(); 
      $f = $event->getForm(); 
      var_dump($data); 
      echo 'hii'; 
     } 
    ); 
  • $事件 - >的getData();總是返回NULL
  • 如果我取消註釋'data_class'它的工作正常,但我不希望如此,我該怎麼辦?
+0

爲了從字段變量創建對象,表單需要知道基礎數據類型。這可以從createForm()的第二個參數中猜到,或者可以使用data_class選項指定。你能否提供一些信息,說明爲什麼你不想將基礎對象的類傳遞給表單? – Matt

+0

@Matt我有物品清單,並且用這種形式的用戶可以過濾物品,但物品不僅僅來自一種物品。一般來說沒有任何方式使用event-> getData而不使用基礎數據類型?? – mohsenJsh

回答

1

因爲我沒有注意到這個問題的日期,但我可能會爲有類似問題的人澄清一些事情。

可以說你有一個表格,其中包含一些字段,你使用它沒有data_class。您始終可以使用控制器中createForm功能的第二個參數預設數據。例如:

class TestType extends AbstractType { 

     /** 
     * @param FormBuilderInterface $builder 
     * @param array $options 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) { 

      // When passing a second argument to createForm you can get the data with $options['data'] 
      dump($options['data']); 

      $builder 
       ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) { 
        // The $event will contain the preset data 
        dump($event->getData()); 
       }) 
       ->add('name', TextType::class) 
       ->add('email', EmailType::class) 
       ->add('message', TextareaType::class) 
       ->add('send', SubmitType::class); 
     } 
    } 

傳遞給預先設置必須是鍵表示表單字段的陣列形式的數據(例如nameemailmessagesend),顯然該值設置到表單字段的值。例如繼續說道:

public function formTestAction(Request $request) { 

    // These values will be preset and are accessible with 
    // $event->getData() (inside an EventListener) OR 
    // through $options['data'] inside the buildForm function 
    $myPreSetData = array(
     'name'  => 'Peter Griffin', 
     'email'  => '[email protected]', 
     'message' => 'The fire truck can consume 8 times his body weight.' 
    ); 

    $form = $this->createForm(TestType::class, $myPreSetData); 

    $form->handleRequest($request); 

    if($form->isSubmitted() && $form->isValid()) { 
     dump('finished'); 
     dump($form->getData()); 
     die(); 
    } 

    return $this->render('@TestPra/Test/test_form.html.twig', array(
     'form' => $form->createView() 
    )); 


} 

但是,你可能也想在其中具有與形式表示數據沒有待辦事項窗體類數據例如設置ChoiceType字段的選項。

在控制器:在這種情況下,你通過createForm函數的第三個參數傳遞數據

$fireTruckColorChoices = array(
    'red' => 0, 
    'ultraRed' => 1 
); 

$form = $this->createForm(TestType::class, $myPreSetData, array(
    'fireTruckColorChoices' => $fireTruckColorChoices 
)); 

裏面你必須設置傳遞選項的名稱所需的TestType類,在此案例fireTruckColorChoices

class TestType extends AbstractType { 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder 
      ... 
      ->add('fireTruckColor', ChoiceType::class, array(
       'choices' => $options['fireTruckColorChoices'], 
      )) 
      ...; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) { 
     // Must be set 
     $resolver->setRequired(array(
      'fireTruckColorChoices' 
     )); 
    } 
} 

您還可能要訪問的EventListener CL來作爲選項傳遞的數據osure。在這種情況下,您只需要在表單中添加一個私有變量:

class TestType extends AbstractType { 

    private $name; 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $this->name = $options['name']; 

     $builder 
      ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) { 
       dump($this->name); 
      }) 
      ...; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setRequired(array(
      'name' 
     )); 
    } 
}