2017-05-09 3 views
0

フォームの選択内容を動的に生成したい。動的選択ゾーンをsymfonyの形式で使用する

私は能力フィールドを持っているOffre Entityを持っています。各コンピテンシーは、GroupeCompetencesと呼ばれる一連のコンピテンシー内にあります。

GroupeCompetences Selectボックスでフォームを作成して、そのグループにあるCompetenceの2番目の選択ボックスにフィードします。ここで

は私のエンティティは以下のとおりです。

Offreエンティティ

/** 
* Offre 
* 
* @ORM\Table(name="offre") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\OffreRepository") 
*/ 
class Offre 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @var Competence 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Competence") 
    */ 
    private $competence; 

    //ALL GETTERS AND SETTERS ... 
} 

能力エンティティ

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Competence 
* 
* @ORM\Table(name="competence") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\CompetenceRepository") 
*/ 
class Competence 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="GroupeCompetences", inversedBy="competences") 
    */ 
    private $groupeCompetence; 

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

     //ALL GETTERS AND SETTERS ... 
} 

GroupeCompetencesエンティティ:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* GroupeCompetences 
* 
* @ORM\Table(name="groupe_competences") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\GroupeCompetencesRepository") 
*/ 
class GroupeCompetences 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Competence", mappedBy="groupeCompetence") 
    */ 
    private $competences; 

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

     //ALL GETTERS AND SETTERS ... 
} 

私は作成することはできませんフォーム( GroupeCompetencesではないので

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 

use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

use Doctrine\ORM\EntityRepository; 

use AppBundle\Entity\Offre; 

class OffreType extends AbstractType 
{ 

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

     $builder 
     ->add('titre') 
     ->add('competence') 

これはOffreエンティティに直接、 を私は説明を)動作しません。

 ->add('groupeCompetences', EntityType::class, array(
      'class' => 'AppBundle:GroupeCompetences', 
      'choice_label' => 'nom', 
      'placeholder' => 'Choisissez un groupe de compétences', 
      )) 
    } 

} 

感謝を事前にすべてのあなたの助けのために! :=)

+0

この を見るhttp://stackoverflow.com/questions/43858460/entity-is-empty-in-formmodifier-on-form-eventsです – rafrsr

+0

例では、会議エンティティに2つのエンティティ(医者と顧客)が含まれているのと同じことはありません。 私の場合、私は1つの能力のグループにリンクされているエンティティ(能力)が1つしかありません。そして、グループはoffreエンティティとリンクされていません – zskiredj

+0

ケースは同じです(もちろん)が、アプローチは似ていますが、必要な変更を加えることもできます。 – rafrsr

答えて

0

これを行うにはjavascriptが必要です。

最初にGroupeCompetencesをレンダリングします。 javascriptアクションのみを追加するため、formbuilderでこれを生成する必要はありません。ちょうど枝で十分でしょう。

秒指定した1つのグループからCompetencesで2番目の選択肢のオプションリストをレンダリングする新しいアクションをコントローラに追加します。

3番目のオプションは、GroupeCompetencesで選択されたオプションが変更されたときに新しいアクションにajaxリクエストを加えます。

+0

こんにちは。私は第二と第三をする方法を知っていると思う。しかし、私はあなたのナンバーワンを理解していません。 選択ボックスをレンダリングするのに、小枝のみを使用することはどういう意味ですか? ありがとう! – zskiredj

0

解決策が見つかりました。私はフォームイベントを使用しなければならなかった。ここでは、コード(多分それが誰かを助けることができる...)

class CompetenceChoisieType extends AbstractType 
{ 

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

     $builder 
     ->add('groupeCompetence', EntityType::class, array(
      'class' => 'AppBundle:Sources\GroupeCompetences', 
      'choice_label' => 'nom', 
      'placeholder' => 'Tous les groupes de compétences', 
      )) 
     ->add('save', SubmitType::class); 

     $formModifier = function (FormInterface $form, GroupeCompetences $groupeCompetences=null){ 
      $competences = null === $groupeCompetences ? array() : $groupeCompetences->getCompetences(); 

      $form->add('competence', EntityType::class, array(
       'class' => 'AppBundle:Sources\Competence', 
       'choice_label' => 'nom', 
       'placeholder' => 'Choisir une compétence', 
       'choices' => $competences, 
       )); 
     }; 


     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) use ($formModifier) { 

       // this would be your entity, i.e. CompetenceChoisie 
       $data = $event->getData(); 

       $formModifier($event->getForm(), $data->getGroupeCompetence()); 
      } 
      ); 

     $builder->get('groupeCompetence')->addEventListener(
      FormEvents::POST_SUBMIT, 
      function (FormEvent $event) use ($formModifier) { 

       $groupeCompetences = $event->getForm()->getData(); 

       $formModifier($event->getForm()->getParent(), $groupeCompetences); 

      } 
      ); 
    } 

} 
関連する問題