Form, widget entity : Passage de paramètre dans le "query_builder"
Bonjour,
J'ai une table Client sur lequel existe un champ "parent_id", ce qui me permet de construire une hiérarchie simple entre clients, sur une seule table (relation one-to-many, auto-référente).
J'ai généré un CRUD Client. Sur mon formulaire, il me faut maintenant un select me permettant de sélectionner un client existant qui va devenir le parent du client en cours d'édition. Deux conditions : il faut que la liste du select ne contiennent que des clients dont le parent_id est à NULL (on ne veut une hiérarchie que à 2 niveau max) ET il faut bien sûr que le client en cours d'édition n'apparaisse pas dans cette liste.
J'ai donc voulu centraliser cette requête dans une méthode de mon ClientRepository. Elle ne me retourne pas les résultats d'une query mais juste un QueryBuilder (nécessaire pour le paramètre 'query_builder' lors de la création de mon form).
Voici le code de ma classe ClientType :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
class ClientType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('parent', 'entity', array(
'class' => 'MonApp\\ClientBundle\\Entity\\Client',
'query_builder' => function(EntityRepository $er) { return
$er->getParentOnly( 2 ); },
))
->add('nom')
->add('prenom'); |
et voici la méthode de mon ClientRepository :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public function getParentOnly($notThisOne = null)
{
$queryBuilder = $this->createQueryBuilder('a');
$queryBuilder->where('a.parent IS NULL');
if($notThisOne != null)
{
$queryBuilder->andWhere('a.id != :notThisOne')
->setParameter('notThisOne', $notThisOne);
}
return $queryBuilder;
} |
Mon soucis : il faut que je passe l'id du client rattaché au formulaire lors de l'appel à $er->getParentOnly( 2 ); } (j'ai mis ici "2" en dur). Je peux accéder à l'id du client courant avec $builder->getData()->getId() (en supposant qu'il n'y a pas plus simple...) mais je n'arrive pas à passer ce paramètre dans ma closure.
Ce code fonctionne :
Code:
1 2 3
|
'query_builder' => function(EntityRepository $er, notThisOne = 2) { return
$er->getParentOnly( $notThisOne ); }, |
mais pas ceux-là (entre autres) :
Code:
1 2 3 4 5 6
|
'query_builder' => function(EntityRepository $er, notThisOne = $builder->getData()->getId() ) { return
$er->getParentOnly( $notThisOne ); },
'query_builder' => function(EntityRepository $er ) { return
$er->getParentOnly( $builder->getData()->getId() ); }, |
D'une manière générale, est-ce-que c'est la bonne méthode pour arriver au résultat que je veux ? Quelqu'un peut-il m'aiguiller pour mon passage de paramètre ?
D'avance, merci beaucoup :zoubi: