我想动态生成表单中选择的内容。
我有一个具有竞争力领域的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',
))
}
}
提前感谢您的帮助! :=)
答案 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);
}
);
}
}