Salut les mecs,

Je suis en train de développer un projet sur Symfony 5 et je galère sur un truc tout con.

Pour vous expliquer en gros la structure de mon projet: on peut créer des contenus (Articles, Diaporamas, Recettes Groupements, etc.). Chacun de ces contenus a des champs communs contenus dans une entité GlobalContent, (qui contient titre, tags, theme, SEO, etc.) de telle sorte que les entités des contenus ont une relation oneToOne avec l'entité GlobalContent.

Là où ça se complique c'est que les contenus peuvent etre associés à un ou plusieurs groupement(s). Il n'y a que les groupements qui ne peuvent pas être associés à un autre groupement. J'ai donc une relation manyToMany entre GlobalContent et Groupement. Seulement, GlobalContent et Groupement ont également une relation oneToMany.

Dans mon entité GlobalContent j'ai donc:

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Groupement", mappedBy="global_content", cascade={"persist", "remove"})
     */
    private $groupement;

    /**
    * @ORM\ManyToMany(targetEntity="App\Entity\Groupement", inversedBy="global_contents")
    */
   private $groupements;

   public function getGroupement(): ?Groupement
    {
        return $this->groupement;
    }

    public function setGroupement(?Groupement $groupement): self
    {
        $this->groupement = $groupement;

        return $this;
    }

    /**
     * @return Collection|Groupement[]
     */
    public function getGroupements(): Collection
    {
        return $this->groupements;
    }

    public function addGroupement(Groupement $groupement): self
    {
        if (!$this->groupements->contains($groupement)) {
            $this->groupements[] = $groupement;
        }

        return $this;
    }

    public function removeGroupement(Groupement $groupement): self
    {
        if ($this->groupements->contains($groupement)) {
            $this->groupements->removeElement($groupement);
        }

        return $this;
    }

Et dans mon entité Groupement:

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\GlobalContent", inversedBy="groupement", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $global_content;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\GlobalContent", mappedBy="groupements"))
     */
    private $global_contents;

     public function getGlobalContent(): ?GlobalContent
    {
        return $this->global_content;
    }

    public function setGlobalContent(GlobalContent $global_content): self
    {
        $this->global_content = $global_content;

        return $this;
    }

    /**
     * @return Collection|GlobalContent[]
     */
    public function getGlobalContents(): Collection
    {
        return $this->global_contents;
    }

    public function addGlobalContent(GlobalContent $global_content): self
    {
        if (!$this->global_contents->contains($global_content)) {
            $this->global_contents[] = $global_content;
        }
        return $this;
    }

    public function removeGlobalContent(GlobalContent $global_content): self
    {
        if ($this->global_contents->contains($global_content)) {
            $this->global_contents->removeElement($global_content);
        }
        return $this;
    }

Depuis un article, je peux rajouter ou supprimer un ou plusieurs groupement(s) sans problème.
Depuis un groupement, je peux voir les articles liés dans problème.
Le problème se pose lorsque je veux rajouter/supprimer des articles depuis un groupement.

Le formulaire de creation/modif des groupements est comme ça:

    $builder
            ->add('main_content')
            ->add('main_informations')
            ->add('image')
            ->add('texte')
            // infos complémetaires
            ->add('global_content', GlobalContentType::class)
            // liste des contenus associés (en excluant les groupements)
            ->add('global_contents', EntityType::class,[
                'class'=>GlobalContent::class,
                'placeholder'=>'Contenus associés',
                'label'=>false,
                'required'=>false,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('f')
                        ->leftJoin('f.groupement', 'groupement')
                        ->andWhere('groupement.id is NULL')
                        ->orderBy('f.main_titre', 'ASC');
                },
                'multiple' => true,
            ])
        ;

Je vous fait grace du code du controller vu que toute les autres modif fonctionne.

Le champ global_contents me remonte bien la liste des contenus, avec les bons contenus associés sélectionnés.

J'ai testé de faire ça a la soumission du formulaire:

    $contenus = $groupement->getGlobalContents();
    dd($contenus->toArray());
    $manager->persist($groupement);
    $manager->flush();

Et ca me remonte bien les contenus que j'ai rentrés dans le formulaire et que je veux voir persister.
Mais rien ne se passe si je fais sans le dd().
Le formulaire est bien envoyé sans erreur, les modification enregistrées mais les contenus associés ne changent pas

Si quelqu'un a une idée, je suis preneur.

1 réponse


Personne pour m'aider ? :'(