以symfony形式的动态选择区域

时间:2017-05-09 17:51:30

标签: symfony doctrine

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

我有一个具有竞争力领域的Offre实体。每个能力都在一组称为GroupeCompetences的能力范围内。

我想创建一个带有GroupeCompetences Select框的表单,该框将提供该组中第二个选择权限框。

以下是我的实体:

Offre Entity

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

表格(我无法创建我解释的内容)

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

这不起作用, 因为GroupeCompetences不直接在Offre Entity:

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

}

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

2 个答案:

答案 0 :(得分:0)

你需要javascript才能做到这一点。

首先渲染一个GroupeCompetences选择。您不需要使用formbuilder生成此文件,因为您只添加了javascript操作。只需要树枝即可。

第二步向您的控制器添加一个新动作,该动作为一个给定组中的Competences呈现第二个选择的选项列表。

第三个添加javascript,当GroupeCompetences中的选定选项发生更改时,会对您的新操作发出ajax请求。

答案 1 :(得分: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);

            }
            );
    }

}