Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je reviens sur ZF2 et j'essaie d'utiliser doctrine 2 avec mes formulaires, mais je tombe sur plusieurs problèmes :
_Lorsque j'essaie de récupérer le serviceLocator dans mon fieldset (via ServiceLocatorAwareInterface), la fonction getServiceLocator() me retourne null.
Voici comment je m'y prends :
[lang=php] //Dans Module.php : public function getFormElementConfig() { return array('invokables' => array('myForm' => 'Namespace\Form\myForm')) } //Dans mon controller : $sl->get('FormElementManager')->get('myForm'); //Dans mon fieldset, j'utilise bien init() plutôt que le constructeur : public function init() { $sl = this->getServiceLocator(); // de type Zend\Form\FormElementManager $sl->getServiceLocator(); // === null }
Il me semblait pourtant que c'est comme ça qu'on s'y prend non ?
_ Pour passer l'hydrator au formulaire, j'utilise une factory avec
[lang=php] use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; $entityManager = $serviceLocator->get('entityManager'); $hydrator = new DoctrineHydrator($entityManager);
comme j'ai vu sur tous les tutoriels trouvés sur le web. Le problème, c'est que ça me sort une erreur (normal, le constructeur de la classe requiert 2 paramètres). Cela vient des tutoriels qui ne sont plus à jour ? Ou j'utilise la mauvaise classe ? Si c'est moi, quelle classe dois-je appeler ?
_ J'essaie d'utiliser les fieldset sur une entité récursive :
[lang=php] $this->add(array( 'type' => 'category', 'options' => array( 'label' => 'category parent', 'label_attributes' => array( 'class' => 'formRow', ), ), 'name' => 'parent', ));
mais j'obtiens l'erreur "Maximum function nesting level of '100' reached" (boucle infinie donc). Comment limiter la profondeur du fieldset, dans mon cas, pour avoir une et une seule catégorie parent (pas de grand parent) ?
Merci de votre réponse !
Dernière modification par Seryus (11-02-2014 11:33:22)
Hors ligne
Salut, je ne vais pas te donner la réponse tout de suite parce que d'une part j'y ai déjà répondu plusieurs fois donc en cherchant un peu tu devrais trouver la réponse. D'autre part passes juste un peu de temps pour te relire !
Pour le Maximum function nesting level of 100 reached, fais une recherche sur google c'est pas forcément une boucle infinie !
Hors ligne
J'ai beau changer la valeur de xdebug, j'ai toujours "Maximum function nesting level of $nb reached" (même à 1000). Je ne vois pas d'où ça peut venir à part d'une boucle infinie, à mon avis provoquée par un champ du fieldset category qui appelle le fieldset category lui même.
Bon, je reverrais tout ça à tête reposée demain.
Hors ligne
Effectivement dans ce cas c'est probablement une boucle infinie. Dans tous les cas une relecture de ton code te permettra de corriger ce problème là c'est pas lié au framework mais à ton code !
Hors ligne
Bon finalement j'ai trouvé la solution à mes problèmes, il ne faut plus réutiliser le fieldset, mais l'objet Select de Doctrine.
Par contre pour mon premier problème, j'ai été obligé d'ajouter aussi mon fieldset dans la méthode init() du formulaire, c'est normal ? Toutes les méthodes init() sont appelés une fois tous les objets créés ?
Il y a moyen de spécifier la "profondeur" directement dans les entités lors d'une association récursive, ou je dois faire les tests moi même dans mon controller (ou repository) ?
Hors ligne
C'est normal que ça soit dans le init(). La méthode est appelée par la fabrique de formulaire après la création de la classe. Ceci permet d'avoir l'injection de l'entityManager.
La profondeur c'est à dire ?
Hors ligne
Par profondeur j'entends, le nombre de parents que peut avoir une catégorie (une catégorie peut avoir une catégorie parent, mais cette catégorie parent ne peut pas avoir elle même de parent), sachant que catégorie contient une clé étrangère qui provient de cette même table (récursive).
Hors ligne
Non tu ne peux pas le faire via les annotation doctrine. Tu as des modules pour gérer ça "gedmo" de mémoire fait pas mal de chose. Après c'est à toi niveau métier de le gérer. Tu peux peut être regarder sur les événements doctrine pour faire les contrôles à ce moment là.
Hors ligne
Ok, je ferai une vérification sur le parent avant d'insérer l'enregistrement de l'enfant dans ce cas.
Merci pour ton aide !
Dernière modification par Seryus (05-02-2014 13:42:46)
Hors ligne
Bonjour,
J'ai de nouveau un conflit entre les formulaires de ZF2 et Doctrine2. Dans le cas d'un héritage, comment affecte-t-on un objet à un formulaire (méthode bind) ? J'ai essayé d'affecter la classe parent, mais la colonne discriminante (dtype) n'est pas remplie par mon formulaire lors de l'insertion (je n'ai pas encore testé pour l'auto-complétion). Je pense que le problème vient du fait qu'il n'y ait pas de setter/getter pour la colonne discriminante (elle est déclarée dans les annotations comme dit dans la doc).
Lorsque j'essaie d'affecter la classe enfant (peut-être que le champ dtype serait complété automatiquement ?), j'obtiens l'erreur "Binding entities to query parameters only allowed for entities that have an identifier."
Comment faire ?
Hors ligne
J'ai finalement trouvé comment mettre la valeur dans la colonne discriminante lorsqu'on bind l'entité parent au formulaire, mais ça ne résout pas mon problème. Il semblerait que ce soit bien l'entité enfant qu'il faut binder au formulaire.
Ce que je comprends du message "Binding entities to query parameters only allowed for entities that have an identifier", c'est qu'il faut que l'entité bindée ait un identifiant. Pourtant dans le cas de l'héritage, l'entité hérite de l'identifiant du parent non ? Il a donc bien un identifiant, où est le problème dans ce cas ?
Hors ligne
Salut, là j'avoue je ne sais pas. J'ai pas eu à utiliser les formulaires avec l'héritage de doctrine. As-tu bien les getters/setters en public dans ta classe mère ?
Hors ligne
Oui ils sont bien en public
Hors ligne
Là comme ça je sais pas, essaie de voir ce qui génère ce message d'erreur pour regarder le test qui est fait. Ca pourrait donner une piste.
Hors ligne
J'ai fait comme tu m'as dit et je pense avoir trouvé d'où venait le problème, je ne cherchais pas au bon endroit.
Soit mon schéma :
_ A entité parent ayant les enfants A1 et A2
_ B entité parent ayant les enfants B1 et B2
_ A1 contient une collection de B1
_ A2 contient une collection de B2
En faite mon formulaire permettait de créer une entité A1 et d'ajouter une collection d'entité B1 à celle-ci.
J'ai fait un dump de l'argument "targetClass" dans la fonction find de la classe "DoctrineModule\Stdlib\Hydrator\DoctrineObject" (qui fait appel à la classe "Doctrine\ORM\ORMInvalidArgumentException" qui génére l'erreur "Binding entities to query parameters only allowed for entities that have an identifier") et le problème d'héritage ne venait pas de l'entité A comme je le pensais, mais de l'entité B !
En creusant un peu j'ai vu que j'avais inversé le nom des classes des deux entités enfants lors de l'appel. Je faisais un bind de A1 en lui ajoutant une collection de B2, plutôt qu'une collection de B1.
J'ai mis le nom de la bonne classe là où il fallait et je n'ai plus eu le message d'erreur. Je ne sais pas vraiment pourquoi il me mettait ce message, mais mon problème semble résolu.
J'espère que mon explication est assez claire
Merci pour ton aide !
Hors ligne