Editer un formulaire comportant un CollectionType

Par newdev-creator, il y a 2 ans


Bonjour à tous,

Lors d'une édition d"une recette, j'ai cette erreur :

Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue(): Argument #1 ($object) must be of type ?object, string given, called in /home/julien/Documents/Dev/Newdevcreator/cook-book/vendor/symfony/form/ChoiceList/ArrayChoiceList.php on line 181

RecipeType

<?php namespace App\Form; use App\Entity\Recipe; use App\Entity\Category; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\FormBuilderInterface; use Vich\UploaderBundle\Form\Type\VichImageType; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Validator\Constraints\Image; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; class RecipeType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('ingredient', CollectionType::class, [ 'entry_type' => IngredientType::class, 'label' => 'Ingrédients', 'entry_options' => ['label' => false], 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]) ->add('recipeStep', CollectionType::class, [ 'entry_type' => RecipeStepType::class, 'label' => 'Etapes', 'entry_options' => ['label' => false], 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]) ->add('title', TextType::class, [ 'attr' => [ 'placeholder' => 'Exemple : Poulet au citron', 'autocomplete' => 'off', ], 'label' => 'Titre de la recette', 'label_attr' => [ 'class' => 'is-input-required' ], 'required' => true, ]) ->add('difficulty', ChoiceType::class, [ 'label' => 'Difficulté de la recette', 'label_attr' => [ 'class' => 'is-input-required' ], 'choices' => [ 'Simplissime' => Recipe::SIMPLE, 'Facile' => Recipe::EASY, 'Moyenne' => Recipe::AVERAGE, 'Difficile' => Recipe::DIFFICULT, 'Niveau grand chef' => Recipe::LEVEL_GRAND_CHEF ] ]) ->add('personCount', IntegerType::class, [ 'attr' => [ 'placeholder' => 'Exemple : 4', 'autocomplete' => 'off', ], 'label' => 'Pour combien de personnes ?', 'label_attr' => [ 'class' => 'is-input-required' ], 'required' => true, ]) ->add('timeCount', IntegerType::class, [ 'attr' => [ 'placeholder' => 'Exemple : 4', 'autocomplete' => 'off', ], 'label' => 'Temps total de la recette (en minutes)', 'label_attr' => [ 'class' => 'is-input-required' ], 'required' => true, ]) ->add('imageFile', VichImageType::class, [ 'label' => 'Image de la recette', 'label_attr' => [ 'class' => 'is-input-required' ], 'attr' => [ 'class' => 'filepond' ], 'help' => 'Formats acceptés : jpg, png. Taille maximale : 5Mo', 'required' => false, 'allow_delete' => false, 'download_uri' => false, 'image_uri' => false, 'asset_helper' => false, 'constraints' => [ new Image([ 'maxSize' => '5M', 'mimeTypes' => [ 'image/jpeg', 'image/png', 'image/jpg' ], 'mimeTypesMessage' => 'Veuillez télécharger un document image valide (jpg, jpeg, png)', ]) ], ]) ->add('categories', CategoryAutocompleteField::class, [ 'label' => 'Catégorie de la recette', 'label_attr' => [ 'class' => 'is-input-required' ], 'required' => true, ]); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Recipe::class, ]); } }

CategoryAutocompleteField

$resolver->setDefaults([ 'class' => Category::class, 'placeholder' => 'Choisissez une ou plusieurs categories', 'choice_label' => 'title', 'label' => 'Choix des catégories', 'multiple' => true, 'required' => false, 'autocomplete' => true, 'attr' => [ 'class' => 'min-widt' ], 'query_builder' => function (CategoryRepository $categoryRepository) { return $categoryRepository->createQueryBuilder('categories'); }, // 'security' => 'ROLE_SOMETHING', ]);

IngredientType

$builder ->add('name', IngredientAutocompleteField::class, [ 'label' => 'Ingrédient', 'label_attr' => [ 'class' => 'is-input-required' ], 'required' => true, 'multiple' => false, ]) ->add('measurement', MeasurementType::class, [ 'mapped' => false, 'label' => false, ]);

IngredientAutocompleteField

$resolver->setDefaults([ 'class' => Ingredient::class, 'placeholder' => 'Choose a Ingredient', 'choice_label' => 'name', 'label' => 'Choix des ingrédients', 'multiple' => true, 'required' => false, 'autocomplete' => true, 'attr' => [ 'class' => 'min-widt' ], 'query_builder' => function (IngredientRepository $ingredientRepository) { return $ingredientRepository->createQueryBuilder('ingredient'); }, // 'security' => 'ROLE_SOMETHING', ]);

MeasurementType

$builder ->add('quantity', IntegerType::class, [ 'label' => 'Quantité', 'label_attr' => [ 'class' => 'is-input-required' ], ]) ->add('unity', ChoiceType::class, [ 'label' => 'Unité', 'label_attr' => [ 'class' => 'is-input-required' ], 'choices' => [ 'Pièce(s)' => Measurement::PIECE, 'ml' => Measurement::LITER, 'g' => Measurement::MASS ] ]);

Ce que je veux

Il semblerait que le collectionType ou le autocompleteField ne renvoient pas l'objet, mais une chaine de caractères.
Je ne vois rien dans la doc à ce sujet.
si j'enlève "ingredient", "recipeStep" et "categories", mon formulaire marche.

Aucune réponse