Bonjour à vous,
Je viens vers vous suite à un problème de mise à jour d'un objet attribut d'un autre objet et d'une erreur sans doute liée lorsque je veux aller consulter les informations de mon formulaire dans le profiler.
Situation :
Deux classes : Regimen && RegimenLine.
Lien entre les deux classes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 /** * @ORM\OneToMany(targetEntity="AM\CytowebBundle\Entity\RegimenLine", mappedBy="regimen", cascade={"persist"}) */ private $regimenLines;Deux classes de Form :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /** * @ORM\ManyToOne(targetEntity="AM\CytowebBundle\Entity\Regimen", inversedBy="regimenLines") * @ORM\JoinColumn(nullable=false) */ private $regimen;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 class RegimenLineType extends AbstractType { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('dose',NumberType::class) ->add('inn', EntityType::class, array( 'class' => Inn::class, 'multiple' => false, 'expanded' => true, )); } /** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'AM\CytowebBundle\Entity\RegimenLine' )); } /** * {@inheritdoc} */ public function getBlockPrefix() { return 'am_cytowebbundle_regimenline'; } }J'ai donc imbriqué un formulaire dans un autre en adaptant le code du tutoriel Symfony 3 en utilisant le Javascript qui permet de générer dynamiquement des formulaires à partir du code contenu dans data-prototype (ça fonctionne visuellement et sans erreur JS dans la console).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 class RegimenType extends AbstractType { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class) ->add('regimenLines', CollectionType::class, array( 'entry_type' => RegimenLineType::class, 'allow_add' => true, 'allow_delete' => true )) ->add('save', SubmitType::class); } /** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'AM\CytowebBundle\Entity\Regimen' )); } /** * {@inheritdoc} */ public function getBlockPrefix() { return 'am_cytowebbundle_regimen'; } }
Premier problème : lorsque je rempli le formulaire, je dois rajouter le foreach suivant dans le controleur sinon ça écrit une erreur :
L'erreur sans le foreach :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 if ($request->isMethod('POST')){ $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); foreach ($regimen->getRegimenLines() as $regimenLine){ $regimenLine->setRegimen($regimen); } $em->persist($regimen); $em->flush(); $request->getSession()->getFlashBag()->add('info', 'Schéma bien enregistré.'); return $this->redirectToRoute('am_cytoweb_regimen', array('id' => $regimen->getId())); } }
ça ne m'inquieterait pas outre mesure si le code exemple du tuto que j'ai suivi n'avait pas besoin lui de faire cette boucle.
De plus, lorsque je met le foreach, j'ai un problème à l'effacement d'une ligne dynamique : visuellement, le DOM est bien modifié mais pas dans l'entité lorsque je soumet le formulaire (le formulaire est bien soumis sans erreur, mais l'entité n'est pas modifiée).
Enfin, lorsque je vais dans le profiler dans la partie "form", j'ai l'erreur suivante :
Encore un problème d'ID ... J'ai bien les méthodes getId() de mes entités.
PS : j'ai bien modifier le addRegimenLine comme conseillé dans le tuto suivi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public function addRegimenLine(\AM\CytowebBundle\Entity\RegimenLine $regimenLine) { $regimenLine->setRegimen($this); $this->regimenLines[] = $regimenLine; return $this; }
Je vous remercie pour votre aide car ma recherche google sur l'erreur ID, bien qu'explicite, ne m'aide pas des masses à debuguer vu que j'ai bien les méthodes getId() dans mes entités.
Partager