2017-05-09 1 views
0

선택 항목의 내용을 동적으로 생성하고 싶습니다.symfony의 동적 선택 영역

필자는 능력 필드가있는 Offre Entity를 보유하고 있습니다. 각 역량은 GroupeCompetences라는 역량 그룹 내에 있습니다.

GroupeCompetences Select 상자가있는 양식을 만들고 싶습니다.이 상자는 해당 그룹에있는 역량의 두 번째 선택 상자를 제공합니다.

<?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 법인

/** 
* 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 ... 
} 

능력 엔티티

Offre 법인 :

<?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

예를 들어 회의 주체가 두 엔티티 (의사 및 고객)를 포함하는 것과 같은 경우는 아닙니다. 필자의 경우 나는 능력 집단과 연결된 실체 (역량)가 하나뿐입니다. 그리고 그 그룹은 외부 단체와 연결되어 있지 않습니다. – zskiredj

+0

사례가 동일하지는 않지만 접근 방식은 유사합니다. 필요한 변경을 할 수 있습니다. – rafrsr

답변

0

이렇게하려면 자바 스크립트가 필요합니다.

먼저 GroupeCompetences를 렌더링합니다. javascript 액션 만 추가하기 때문에 formbuilder를 사용하여 생성 할 필요가 없습니다. 그냥 나뭇 가지가 충분합니다.

초 주어진 그룹에서 역량으로 두 번째 선택을위한 옵션 목록을 렌더링하는 컨트롤러에 새 작업을 추가합니다.

세 번째 GroupeCompetences에서 선택한 옵션이 변경 될 때 새 작업에 대해 ajax 요청을하는 javascript를 추가하십시오.

+0

안녕하세요. 제 2, 제 3을하는 법을 알고 있다고 생각합니다. 그러나 나는 당신의 번호 하나를 이해하지 않는다. 나뭇 가지만 사용하여 선택 상자를 렌더링한다는 것은 무엇을 의미합니까? 감사합니다. – 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); 

      } 
      ); 
    } 

}