symfony形式的动态选择区域

symfony形式的动态选择区域,symfony,doctrine,Symfony,Doctrine,我想在表单中动态生成选择的内容 我有一个具有能力领域的Offre实体。每种能力都在一组称为“群体能力”的能力中 我想创建一个带有GroupeCompertences选择框的表单,它将为该组中的第二个能力选择框提供信息 以下是我的实体: 主任实体 /** * Offre * * @ORM\Table(name="offre") * @ORM\Entity(repositoryClass="AppBundle\Repository\OffreRepository") */ class Of

我想在表单中动态生成选择的内容

我有一个具有能力领域的Offre实体。每种能力都在一组称为“群体能力”的能力中

我想创建一个带有GroupeCompertences选择框的表单,它将为该组中的第二个能力选择框提供信息

以下是我的实体:

主任实体

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

提前感谢您的帮助!:=)

您需要javascript来实现这一点

首先渲染一个GroupeCompentences选择。您不需要使用formbuilder生成此操作,因为您只添加javascript操作。只要一根树枝就够了

第二,向控制器添加一个新操作,该操作将为您的第二次选择提供一个选项列表,其中包含一个给定组中的权限


第三,添加javascript,当组能力选择中的所选选项发生更改时,该javascript会向新操作发出ajax请求。

我找到了解决方案。我必须使用表单事件。这是代码(也许它可以帮助某人…)


请看,这与示例中的情况不同,会议实体包含两个实体(医生和客户)。就我而言,我只有一个实体(能力)与一组能力相关。该团体与非官方实体没有联系。情况不一样(当然),但方法相似,有一些变化,你可以做你需要的。是的,我明白了。但是,即使不是表单的一部分(因为它不在实体中),您如何在表单中生成GroupCompetencies?谢谢谢洛。我想我知道怎么做第二和第三。但是我不明白你的第一。仅使用细枝渲染选择框是什么意思?谢谢
<?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 ...
}
<?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')
       ->add('groupeCompetences', EntityType::class, array(
            'class' => 'AppBundle:GroupeCompetences',
            'choice_label' => 'nom',
            'placeholder' => 'Choisissez un groupe de compétences',
            ))
    }

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

            }
            );
    }

}