Bonjour,
Je travail sur un formulaire de commande avec des listes déroulantes qui s'auto remplisse en fonction du choix dans les listes précédentes actuellement j'ai donc :
Un "Utilisateur" qui détermine le contenu de la liste "CentreCout" qui détermine la liste "Activite" générer des listes à partir d'un champ sélectionné je maitrise désormais (il m'en a fallut du temps :p).
Le problème est la liste suivante qui est "SousProjet" doit être déterminé par la sélection du "CentreCout" ET de "Activite" (chaque élément entre guillemet est une entité).
Voici la partie Doctrine de SousProjet:
/**
* @var \Doctrine\Collections\Collection|Activite[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\Activite", mappedBy="sousprojets")
*/
private $activites;
/**
* @var \Doctrine\Collections\Collection|CentreCout[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\CentreCout", mappedBy="sousProjets")
*/
private $centrescouts;
CentreCout:
/**
* @var \Doctrine\Collections\Collection|SousProjet[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\SousProjet", inversedBy="centrescouts")
* @ORM\JoinTable(name="centres_couts_sous_projet",
* joinColumns={@ORM\JoinColumn(name="centrecout_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="sous_projet_id", referencedColumnName="id")}
* )
*/
protected $sousProjets;
Activite:
/**
* @var \Doctrine\Collections\Collection|SousProjet[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\SousProjet", inversedBy="activites")
* @ORM\JoinTable(name="activites_sous_projets",
* joinColumns={@ORM\JoinColumn(name="activite_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="sous_projet_id", referencedColumnName="id")}
* )
*/
protected $sousprojets;
Chaque entité à des methodes comme celles ci (la c'est dans Activite):
/**
* @return Collection|SousProjet[]
*/
public function getSousProjets()
{
return $this->sousprojets;
}
/**
* @param SousProjet $sousprojet
*/
public function addSousProjet(SousProjet $sousprojet): self
{
if(!$this->sousprojets->contains($sousprojet))
{
$this->sousprojets->add($sousprojet);
$sousprojet->addActivite($this);
}
return $this;
}
/**
* @param SousProjet $sousprojet
*/
public function removeSousProjet(SousProjet $sousprojet)
{
if($this->sousprojets->contains($sousprojet)) {
$this->sousprojets->removeElement($sousprojet);
$sousprojet->removeActivite($this);
}
}
Et enfin la génération et la gestion de mon formulaire:
// Catch l'event de la selection de l'activite
$builder->get('activite')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$data = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $data);
}
);
$formModifier = function (FormInterface $form, Object $data = null) {
if($data instanceof Utilisateur)
{
$CentreCouts = null === $data ? array() : $data->getCentresCouts();
$form->add('centreCout', EntityType::class, array(
'label' => 'Centre Cout',
'class' => 'App\Entity\CentreCout',
'placeholder' => '',
'choices' => $CentreCouts
));
}elseif($data instanceof CentreCout){
$activites = null === $data ? array() : $data->getActivites();
$form->add('activite', EntityType::class, array(
'label' => 'Activite',
'class' => 'App\Entity\Activite',
'placeholder' => '',
'choices' => $activites
));
}elseif($data instanceof Activite){
$metiers = null === $data ? array() : $data->getContratsMetiers();
$sousProjet = null === $data ? array() : $data->getSousProjets();
$compteComptable = null === $data ? array() : $data->getComptesComptables();
$form->add('contratMetier', EntityType::class, array(
'label' => 'Contrat Metier',
'class' => 'App\Entity\ContratMetier',
'placeholder' => '',
'choices' => $metiers
));
$form->add('sousProjet', EntityType::class, array(
'label' => 'Sous Projet',
'class' => 'App\Entity\SousProjet',
'placeholder' => '',
'choices' => $sousProjet,
'required' => false,
));
$form->add('compteComptable', EntityType::class, array(
'label' => 'Sous Projet',
'class' => 'App\Entity\CompteComptable',
'placeholder' => '',
'choices' => $compteComptable
));
}
};
Dans le code actuellement le SousProjet est uniquement déterminé par l'Activite mais finalement comme expliqué il doit être determiné par l'Activite et le CentreCout.
Le problème est que je catch uniquement la selection de l'Activite à ce moment je ne vois donc pas trop comment gérer ce cas...
Et au passage le code ajax :
$('body').on('change','#commande_activite',function(){
var $form = $(this).closest('form');
var data = {};
data[$('#commande_activite').attr('name')] = $('#commande_activite').val();
console.log(data);
$.ajax({
url : $form.attr('action'),
type : $form.attr('method'),
data : data,
success: function(html) {
$('#commande_contratMetier').replaceWith(
$(html).find('#commande_contratMetier')
);
$('#commande_sousProjet').replaceWith(
$(html).find('#commande_sousProjet')
);
$('#commande_compteComptable').replaceWith(
$(html).find('#commande_compteComptable')
);
}
});
});
Merci d'avance pour votre aide :) !