Bonjour !
Désolé je spamme ces temps-ci. C’est que je suis enthousiaste sur un nouveau projet intéressant ^^'
Toujours pour mon salon du livre, je m’intéresse aux commandes de livres, maintenant. Et comme j’avais laissé tombé twig et les forms de Symfony pour des frontends en JS/Ajax ces derniers temps, je m’emmêle les pinceaux en essayant de respecter les formes (ah ah) de Symfony.
J’ai une Entité Stock, qui a notamment comme champ "quantités demandées" (ordered). Mais il a surtout un champ Book (Entité) et un champ Author (Entité aussi). L’idée est de pouvoir retrouver les commandes par auteurs, par livres, et par plein d’autres trucs utiles pour les administrateurs.
Un Auteur peut depuis son interface commander ses propres livres. Là ça va, c’est facile. Ce que j’aimerais maintenant c’est permettre aux Administrateurs de passer aussi des commandes. Le processus que j’aimerais qu’ils suivent, c’est que :
1- ils choisissent dans un menu déroulant l’Auteur
2- et c’est là mon souci : il y a ensuite un champ livre qui ne propose QUE les livres de l’auteur sélectionné en 1 pour éviter les erreurs et les requêtes inutiles. C’est une variante du formulaire de création depuis l’interface des auteurs dans laquelle je passais au formulaire les 'choices’ de mon ChoiceType depuis le Controller (ie tous les livres de l’auteur connecté).
3- suite du formulaire dans lequel ils notent les quantités demandées.
class AdminStockCreationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('Author', EntityType::class, [
'class' => Author::class,
'choice_label' => 'name',
]);
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event): void {
$form = $event->getForm();
$author = $event->getData();
$formOptions = [
'label' => 'Livre',
'class' => Book::class,
'placeholder' => 'Choisissez le livre',
'choice_label' => 'title',
'query_builder' => function (BookRepository $bookRep, AuthorRepository $authorRep): QueryBuilder {
return $authorBooks = $author->getBooks();
},
];
// create the field, this is similar the $builder->add()
// field name, field type, field options
$form->add('book', EntityType::class, $formOptions);
});
$builder
->add('ordered')
->add('origin')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Stock::class,
]);
}
}
Si je fais ça, j’ai une erreur "Too few arguments to function App\Form\AdminStockCreationFormType::App\Form{closure}(), 1 passed in C:\wamp64\www\salondulivre\vendor\symfony\doctrine-bridge\Form\Type\EntityType.php on line 32 and exactly 2 expected".
Si je ne mets rien dans la fonction query_builder il me dit " undefined method named "getBooks" of class "App\Entity\Stock".
Si je mets AuthorRepository $authorRep, il me dit qu’il attend un BookRepository.
Je dois donc m’y prendre comme un manche, mais l’idée est là, pourtant. Que dois-je corriger s’il vous plait ?
Edit : en écrivant ceci je me rends compte que mon champ Author dans mon Stock est superflu. Il y a d’autres moyens d’afficher les données. C’est le livre, qui compte, bien plus que l’auteur. Mais ça ne change rien au processus que les administrateurs doivent suivre pour passer une commande…