2017-09-28 12 views
0

私は自分の問題について説明します:symfonyでドロップダウンリストを動的に埋め込むには?

私は以前のものの選択肢に従ってドロップダウンリストを記入するフォームを作成する必要があります。

A地域は、いくつかの都市(ManyToOne)の関係を有することができる。

私は2つのエンティティを持っています。

私はここからHow to Dynamically Modify Forms Using Form Events (Dynamic Generation for Submitted Forms)の文書に従った。ここで

は、エンティティのためのコードです:

リージョンエンティティ:

class Region 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nom", type="string", length=255) 
    */ 
    private $nom; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="numero", type="smallint") 
    */ 
    private $numero; 
} 

ヴィルエンティティ:

class Ville 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nom", type="string", length=255) 
    */ 
    private $nom; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="numero", type="smallint") 
    */ 
    private $numero; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="codePostal", type="smallint") 
    */ 
    private $codePostal; 

    /** 
    * @var Region 
    * 
    * @ORM\ManyToOne(targetEntity="GE\CandidatBundle\Entity\Region") 
    */ 
    protected $region; 
} 

私の問題:

私はとの領域のリストを取得しますquery_builderオプションだが、ciのリストを取得する方法地域の選択に応じて結ぶ。

AnnonceType:

$builder 
->add('region', EntityType::class, [ 
       'label' => 'Region *', 
       'label_attr' => [ 
        "class" => "smaller lighter blue", 
        "style" => "font-size: 21px;", 
       ], 
       'class'   => 'GECandidatBundle:Region', 
       'choice_label' => 'nom', 
       'multiple'  => false, 
       'query_builder' => function(RegionRepository $repository) { 
        return $repository->getListeRegion(); 
       } 
      ]) 
      ->add('ville', TextType::class, [ 
       'label' => 'Ville *', 
       'label_attr' => [ 
        "class" => "smaller lighter blue", 
        "style" => "font-size: 21px;", 
       ], 
      ]); 
$formModifier = function (FormInterface $form, Region $region = null) { 
      $ville = null === $region ? array() : $region->getNom(); 

      $form->add('ville', EntityType::class, array(
       'class' => 'GECandidatBundle:Ville', 
       'placeholder' => '', 
       'choices' => $ville, 

       'label' => 'Ville *', 
       'label_attr' => [ 
        "class" => "smaller lighter blue", 
        "style" => "font-size: 21px;", 
       ], 
       'choice_label' => 'nom', 
       'multiple'  => false, 
       /*'query_builder' => function(VilleRepository $repository) { 
        return $repository->getVilleByRegion(); 
       }*/ 
      )); 
     }; 

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

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

new.html.twig:

{{ form_start(form) }} 
     {{ form_row(form.region) }} {# <select id="ge_candidatbundle_annonce_region" ... #} 
     {{ form_row(form.ville) }} {# <select id="ge_candidatbundle_annonce_ville" ... #} 
     {# ... #} 
    {{ form_end(form) }} 
<script> 
     var $region = $('#ge_candidatbundle_annonce_region'); 
     $region.change(function() { 
      var $form = $(this).closest('form'); 
      var data = {}; 
      data[$region.attr('nom')] = $region.val(); 
      $.ajax({ 
       url : $form.attr('action'), 
       type: $form.attr('method'), 
       data : data, 
       success: function(html) { 
        $('#ge_candidatbundle_annonce_ville').replaceWith(
         $(html).find('#ge_candidatbundle_annonce_ville') 
        ); 
       } 
      }); 
     }); 
    </script> 

答えて

0

UPDATE

  1. 私はエンティティを修正しました。

  2. 私はAnnonceTypeを変更しました。

  3. new.html.twigを変更しました。ここで

は、エンティティのためのコードです:

リージョンエンティティ:

class Region 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nom", type="string", length=255) 
    */ 
    private $nom; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="numero", type="smallint") 
    */ 
    private $numero; 
/** 
* @ORM\OneToMany(targetEntity="GE\CandidatBundle\Entity\Ville", mappedBy="region") 
**/ 
protected $villes; 

/** 
* Get villes 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getVilles() 
{ 
    return $this->villes; 
} 
} 

ヴィルエンティティ:

class Ville 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nom", type="string", length=255) 
    */ 
    private $nom; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="numero", type="smallint") 
    */ 
    private $numero; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="codePostal", type="smallint") 
    */ 
    private $codePostal; 

/** 
* @var Region 
* @ORM\ManyToOne(targetEntity="GE\CandidatBundle\Entity\Region", inversedBy="villes") 
*/ 
protected $region; 
} 

AnnonceType:

 $builder 
    ->add('region', EntityType::class, [ 
        'label' => 'Region *', 
        'label_attr' => [ 
         "class" => "smaller lighter blue", 
         "style" => "font-size: 21px;", 
        ], 
        'class'   => 'GECandidatBundle:Region', 
        'choice_label' => 'nom', 
        'multiple'  => false, 
        'query_builder' => function(RegionRepository $repository) { 
         return $repository->getListeRegion(); 
        } 
       ]) 
       ->add('ville'); 
$formModifier = function (FormInterface $form, Region $region = null) { 
      $villes = null === $region ? array() : $region->getVilles(); 

      $form->add('ville', EntityType::class, array(
       'class' => 'GECandidatBundle:Ville', 
       'placeholder' => '', 
       'choices' => $villes, 

       'label' => 'Ville *', 
       'label_attr' => [ 
        "class" => "smaller lighter blue", 
        "style" => "font-size: 21px;", 
       ], 
       'choice_label' => 'nom', 
       'multiple'  => false, 

      )); 
     }; 

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

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

new.html.twig:

{{ form_start(form) }} 
      {{ form_row(form.region) }} {# <select id="ge_candidatbundle_annonce_region" ... #} 
      {{ form_row(form.ville) }} {# <select id="ge_candidatbundle_annonce_ville" ... #} 
      {# ... #} 
     {{ form_end(form) }} 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
    <script> 
      var $region = $('#ge_candidatbundle_annonce_region'); 
      $region.change(function() { 
       var $form = $(this).closest('form'); 
       var data = {}; 
       data[$region.attr('name')] = $region.val(); 
       $.ajax({ 
        url : $form.attr('action'), 
        type: $form.attr('method'), 
        data : data, 
        success: function(html) { 
         $('#ge_candidatbundle_annonce_ville').replaceWith(
          $(html).find('#ge_candidatbundle_annonce_ville') 
         ); 
        } 
       }); 
      }); 
     </script> 
0

多くのソリューション:

simplierは、あなたのRegionエンティティにvillesを追加し、そのような何かをしなければなりません。

class Region 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nom", type="string", length=255) 
    */ 
    private $nom; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="numero", type="smallint") 
    */ 
    private $numero; 

    /** @ORM\OneToMany(targetEntity="Ville", inversedBy="region") **/ 
    protected $villes; 

    public function getVilles() 
    { 
     return $this->villes; 
    } 

    public function setVilles($villes) 
    { 
     $this->villes = $villes; 

     return $this; 
    } 
    // [... + get/setVilles functions ...] 
} 

そして、あなたのタイプに:

$formModifier = function (FormInterface $form, Region $region = null) { 
      $villes = null === $region ? array() : $region->getVilles(); 

      $form->add('ville', EntityType::class, array(
       'class' => 'GECandidatBundle:Ville', 
       'placeholder' => '', 
       'choices' => $villes, 

       'label' => 'Ville *', 
       'label_attr' => [ 
        "class" => "smaller lighter blue", 
        "style" => "font-size: 21px;", 
       ], 
       'choice_label' => 'nom', 
       'multiple'  => false, 
       /*'query_builder' => function(VilleRepository $repository) { 
        return $repository->getVilleByRegion(); 
       }*/ 
      )); 
     }; 

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

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

番目のオプション:

コメントを外しクエリビルダと引数にregionエンティティ

UPDATE

を渡すことによって、あなたの VilleRepositoryあなた getVilleByRegionに実装

既存の属性を持たないajaxデータを設定するnomで、あなたのjavascriptのコードを置き換える:

<script> 
     var $region = $('#ge_candidatbundle_annonce_region'); 
     $region.change(function() { 
      var $form = $(this).closest('form'); 
      var data = {}; 
      data[$region.attr('name')] = $region.val(); 
      $.ajax({ 
       url : $form.attr('action'), 
       type: $form.attr('method'), 
       data : data, 
       success: function(html) { 
        $('#ge_candidatbundle_annonce_ville').replaceWith(
         $(html).find('#ge_candidatbundle_annonce_ville') 
        ); 
       } 
      }); 
     }); 
    </script> 
+0

コメントは、拡張された議論やデバッグセッションのためではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/155618/discussion-on-answer-by-julien-bourdic-how-to-fill-the-dropdown-list-dynamically) 。回答を明確にする必要がある場合は、コメントで議論するのではなく、編集する必要があります。新しい問題がある場合は、新しい質問をする必要があります。 –

関連する問題