2017-05-08 8 views
1

英語は母国語ではありません。申し訳ありません。フォームイベントのformModifierでエンティティが空です。

私は会議エンティティ(rendezVous)を持っていますが、このエンティティでは、エンティティdoctor(docteur)とcustomer(client)の2つがマッピングされています。

お客様を選ぶ際に医師のリストを変更したいと考えています。

私はRendezVousTypeにフォームイベントを作成しますが、問題は私が顧客を選択すると、Clientエンティティが私のformModifierで空です。

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('client', EntityType::class, array(
      'class' => 'AppBundle:Client', 
      'placeholder' => '', 
     )); 

    $formModifier = function (FormInterface $form, Client $client = null) { 
     $idEspece = null === $client ? 0 : $client->getId(); 

     $form->add('docteur', EntityType::class, array(
      'class' => 'AppBundle:Docteur', 
      'placeholder' => '', 
      'query_builder' => function (DocteurRepository $er) use ($idEspece) { 
       return $er->getByClientEspece($idEspece); 
      }, 
     )); 
    }; 

    $builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function (FormEvent $event) use ($formModifier) { 
      $data = $event->getData(); 
      $formModifier($event->getForm(), $data->getClient()); 
     } 
    ); 

    $builder->get('client')->addEventListener(
     FormEvents::POST_SUBMIT, 
     function (FormEvent $event) use ($formModifier) { 
      $client = $event->getForm()->getData(); 
      $formModifier($event->getForm()->getParent(), $client); 
     } 
    ); 
} 

$ idEspeceのデフォルト値を設定すると、クエリビルダは正しいリストを返します。

答えて

0

あなたのフォームタイプは有効ですが、Symfonyは自動的にajaxを使用しないので、フォーム提出後に医者が表示されます。

次に、ajaxを使って医師のリストを取得するには、追加のロジックを追加する必要があります。

まず、スクリプトに次のjQueryプラグインを追加し、医師のリストを取得し、JSON

/** 
* @Route(name="get_doctors", path="/get_doctors") 
*/ 
public function getDoctorsAction(Request $request) 
{ 
    $client = $request->get('rendez_vous')['client']; 
    $clients = $this->getDoctrine() 
        ->getRepository('AppBundle:Docteur') 
        ->getByClientEspece($client) 
        ->select('s.id', 's.name') 
        ->getQuery() 
        ->getArrayResult(); 
    $indexedClients = array_column($clients, 'name', 'id'); 

    return new JsonResponse($indexedClients); 
} 

を返すために、あなたのコントローラーでアクションを作成します。

https://appelsiini.net/projects/chained/

<script type="text/javascript" src="{{ asset('js/jquery.chained.min.js') }}"></script> 
<script type="text/javascript" src="{{ asset('js/jquery.chained.remote.min.js') }}"></script> 

医師の入力にjQueryプラグインを初期化するために、フォームの後に次のJavaScriptを追加します。

{{ form(form) }} 
<script> 
    $("#rendez_vous_docteur").remoteChained({ 
     parents: "#rendez_vous_client", 
     url: '{{ path('get_doctors') }}', 
     clear: true, 
     loading: "Loading..." 
    }); 
</script> 

ADIVSE:例で使用される必要なIDやパラメータなどの見直しや更新を。あなたのための

0

おかげで役立ちますが、私は単純に実行して自分で自分の問題を解決し

php app/console cache:clear 

あなたはこの

PSのためのお時間が緩んでいる場合、私は、ごめんなさい:私はthisチュートリアルに従っsymfony docはフォームイベントを作成します。

関連する問題