2014-03-04 4 views
2

나는 아무 data_class와 formType 클래스를 만들 :

모든
$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 항목 목록이 있습니다.이 양식을 사용하면 사용자가 항목을 필터링 할 수 있지만 항목은 하나의 etity에서 온 것이 아닙니다. 일반적으로 기본 데이터 형식을 사용하지 않고 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); 
     } 
    } 

는 키 양식 필드를 나타내는 배열이어야 미리 폼을 전달하는 데이터 (예 name, email, message, send) 분명 값 양식 필드에 설정된 값이다. 예 계속 :

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 필드에 대한 선택 사항을 설정하십시오. 이에, 필요에 따라이 전달 된 옵션의 이름을 설정해야하는 TestType 클래스 내부

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

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

: 컨트롤러에서

:이 경우는 createForm 함수의 세 번째 인수를 통해 데이터를 전달 경우 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)에 옵션으로 전달 된 데이터에 액세스 할 수 있습니다 오 슈레. 이 경우 양식에 개인 변수를 추가하기 만하면됩니다.

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