Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-02-2015 11:45:25

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

[Résolu]Form Collection imbriqué et persist dans doctrine

Bonjour,

J'ai 3 entités ConfigFields <- ConfigMapping <- ConfigMappingAttributes

Une ConfigFields possède une collection de ConfigMapping au niveau du formulaire cela donne la possibilité d'ajouter autant de mapping que voulu.
Chaque mapping possède des attributs ici aussi géré dans une autre collection.

Lors du submit de mon formulaire, mes données s'enregistrent en base à tous les niveaux.
ConfigMapping avait besoin des méthodes AddMappings et RemoveMappings pour ajouter correctement les mappings correspondant à la configuration. Une erreur était lancé si les méthode n'existait pas : conformément à ce code :
https://github.com/doctrine/DoctrineMod … yValue.php

Toutefois j'espérais, et j'avais besoin que ce soit aussi le cas pour la collection ConfigMappingAttributes et même si mon cascade ={"persist"} enregistre les données en base, la clé étrangère de ConfigMapping dans ConfigMappingAttributes ne s'insère pas, et je n'arrive pas à comprendre pourquoi. Les méthodes AddAttributes et removeAttributes ne sont pas demandés comme s'il n'en avait pas besoin, pourtant aucune différence n'existe dans le code entre la première collection et la seconde.


EDIT: Si je renseigne la clé étrangère dans ConfigMappingAttributes a la main dans la table, au niveau du formulaire, les données seront bien "bind" et donc on s'y retrouve, mais l'automatiser dans le code semble plus  compliqué...

ConfigFields

Code:

[lang=php]
    public function __construct()
    {
        $this->mappings = new ArrayCollection();
    }

    /**
     * Référence les mapping d'une config
     * @ORM\OneToMany(targetEntity="ConfigMapping", mappedBy="configFields", cascade={"persist"})
     */
    protected $mappings;

    /**
     * Méthode permettant d'ajouter un mapping a une configuration
     * @param ConfigMapping $mapping notre mapping a ajouter
     */
    public function addMapping(ConfigMapping $mapping)
    {
       $mapping->setConfigFields($this);
       $this->mappings[] = $mapping;
    }

    /**
     * Méthode permettant de parser une collection afin d'ajouter chaque mapping à la configuration actuelle
     * @param ArrayCollection $mappings nos mappings
     */
    public function addMappings(ArrayCollection $mappings)
    {
        foreach ($mappings as $mapping) {
            $this->addMapping($mapping);
        }
    }

Config mapping possède donc une foreign key de ConfigFields et une collection d'attributs
J'ai rajouté la méthode add mais qui n'est jamais appelée

Code:

[lang=php]
    public function __construct()
    {
        $this->attributes = new ArrayCollection();
    }


    /**
     * Clé étrangère de la table configFields
     * @var int|null
     * @ORM\ManyToOne(targetEntity="ConfigFields", inversedBy="mappings")
     * @ORM\JoinColumn(name="configFields", referencedColumnName="idConfigFields", onDelete="CASCADE")
     */
    protected $configFields;

    /**
     * @ORM\OneToMany(targetEntity="ConfigMappingAttributes", mappedBy="idMapping", cascade={"persist"})
     */
    protected $attributes;

    /**
     * Méthode permettant d'ajouter un attribut à une configuration 
     */
    public function addAttribute(ConfigMappingAttributes $attribute)
    {
        var_dump($attribute);exit;
        $attribute->setIdMapAttr($this);
        $this->attributes[] = $attribute;
    }


    public function addAttributes(ArrayCollection $attributes)
    {
        foreach ($attributes as $attribute) {
            $this->addAttribute($attribute);
        }
    }

Et la dernier entité, possède une clé étrangère de configMapping, mais qui malheureusement lors du persist ne se renseigne pas...

Code:

[lang=php]
    /**
     * @var int|null
     * @ORM\ManyToOne(targetEntity="ConfigMapping", inversedBy="attributes")
     * @ORM\JoinColumn(name="idMapping", referencedColumnName="idMapping", onDelete="CASCADE")
     */
    protected $idMapping;

N'hésitez pas à me demander plus d'infos si nécéssaire, à bientôt !

Dernière modification par JGreco (13-02-2015 12:08:27)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 07-02-2015 23:49:31

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu]Form Collection imbriqué et persist dans doctrine

J'ai avancé un peu dans mon problème, l'insert se fait à présent correctement grâce à un petit bout de code trouvé ici : http://symfony.com/fr/doc/current/cookb … tions.html

Donc maintenant, j'ai testé l'update ou l'insert, et là même soucis, rien ne se fait. Je ne comprends pas pourquoi... le persist ne persist pas les collections, mais mes champs principaux sont bien mis à jour. j'ai vérifié le form->getData, mes collections sont bien avec les data à mettre à jour.

EDIT: Après avoir debugué mon script je me suis rendu compte que le persist fonctionne bien mais le flush non, en fait je faisait un flush avec un paramètre qui était mon entité config, et quand on ne donne pas de paramètres il fait bien le flush sur tout ce qu'il y a dans le persist, et mes collection était correctement persisté, donc l'insert et l'update marche mieux.

Mais toujours aucun indice sur la suppression.

Dernière modification par JGreco (09-02-2015 11:07:45)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages