Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 03-02-2014 17:07:45

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Doctrine 2 et formulaires

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 :

Code:

[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

Code:

[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 :

Code:

[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

 

#2 03-02-2014 17:26:01

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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 wink !

Pour le Maximum function nesting level of 100 reached, fais une recherche sur google c'est pas forcément une boucle infinie wink !

Hors ligne

 

#3 03-02-2014 17:56:36

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#4 04-02-2014 09:06:57

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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 wink !

Hors ligne

 

#5 04-02-2014 11:44:47

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#6 04-02-2014 12:22:27

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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

 

#7 04-02-2014 13:02:55

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#8 04-02-2014 14:13:44

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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

 

#9 04-02-2014 14:29:58

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#10 15-04-2014 15:33:31

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#11 15-04-2014 17:12:27

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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

 

#12 16-04-2014 09:13:14

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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

 

#13 16-04-2014 10:13:23

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

Oui ils sont bien en public

Hors ligne

 

#14 16-04-2014 10:26:15

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et formulaires

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

 

#15 16-04-2014 11:40:41

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Doctrine 2 et formulaires

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 smile

Merci pour ton aide !

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