Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-09-2013 21:49:25

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

Formulaires, modèles et hydratation

Bonjour,

Ça fait maintenant un moment que je travaille avec ZF2 et ses formulaires. Habituellement pour valider les valeurs de l'élément multicheckbox, je lui passe un tableau de valeur que j'ai récupéré de la base de données depuis mon model :

Code:

[lang=php]
$formulaire->get('selection')->setValueOptions(
    $options
);

Je lui passe les données, puis je le valide comme suit :

Code:

[lang=php]
$formulaire->setData($this->getRequest()->getPost());
if($formulaire->isValid())

Avant (je ne sais pas pourquoi et depuis quand ça ne fonctionne plus), si l'utilisateur avait modifié la valeur d'une des checkbox avant de soumettre le formulaire, la validation ne passait pas (the value was not in haystack ou quelque chose du genre), ce qui est normal.

Aujourd'hui je refais donc un formulaire de cette même façon, mais même si l'utilisateur modifie la valeur d'une checkbox, le formulaire se valide quand même !
Je n'arrive pas à comprendre pourquoi. J'ai essayé avec un élément select, cette méthode fonctionne, mais plus avec multicheckbox.

De plus j'ai récemment eu un autre problème avec les formulaires : j'utilisais un même formulaire de modification de profil pour les utilisateurs, et pour les administrateurs (les admins ont forcément des trucs en plus). Les champs que les administrateurs ont en plus n'ont pas besoin d'être validé, les valeurs sont déjà filtrées et validées auparavant, j'utilise donc le même input filter pour le formulaire, que ce soit pour un admin ou utilisateur normal.
Pourtant le formulaire ne passe pas la validation (pas de message d'erreur) quand un utilisateur normal le soumet. Lorsque je fais un var_dump de $formulaire->getMessages(), j'obtiens les messages d'erreurs concernant les champs des administrateurs (value is required and can't be empty). Je n'ai aucun filtre sur ces champs, j'ai essayé d'enlever le setAttribute('required', true) que j'avais mis, mais rien à y faire.

J'ai réussi à contourner le problème en utilisant $formulaire->getInputFilter()->remove($element) (oui je supprime l'input filter qui n'existe pas), mais je ne comprends pas pourquoi je suis obligé de mettre ça.

Pourriez-vous m'éclairer sur le sujet ?

Dernière modification par Seryus (23-09-2013 03:31:01)

Hors ligne

 

#2 02-09-2013 09:22:15

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

Re: Formulaires, modèles et hydratation

Salut, la documentation est pas forcément super clair à ce sujet mais tu n'utilises pas correctement les formulaires.

Pour ton premier problème je ne vois pas, personnellement j'utilise les éléments de formulaire apporté par DoctrineModule qui fonctionnent plutôt bien. Il y a un cas où ça fonctionne pas mais c'est facilement contournable.

Concernant ton soucis de formulaire entre admin et user c'est simple. Tu dois faire deux formulaires différents ! Il est conseillé de faire un formulaire par action (create, update etc ...). Comme ça ça parait lourd à mettre en place et de la répétition de code c'est pour ça qu'il faut utiliser les fieldset. Une fieldset représente un modèle.
Dans ton cas j'imagine que le modèle c'est utilisateur, tu vas donc dans ton fieldset mettre tous les champs de ton modèle et suivant le formulaire qui va inclure le fieldset, tu vas renseigner le validationGroup différemment pour faire les validations, filtres etc ... L'inputfilter sera mis automatiquement à jours avec les informations du validationGroup.

Hors ligne

 

#3 02-09-2013 10:05:42

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

Re: Formulaires, modèles et hydratation

Je n'utilise pas correctement les formulaires ? On ne le rempli/valide pas comme ça, ou bien tu parles des fieldset que je n'utilise pas ?

Je viens de regarder ce qu'était un fieldset dans ZF2, et d'après ce que j'ai compris, c'est un ensemble de champs qu'on réutilisera plusieurs fois dans plusieurs formulaires, un peu comme une classe parent pour le formulaire c'est bien ça ?

Sinon j'utilise le formulaire sur la même action, simplement je vérifie les droits et j'affiche le formulaire correspondant au niveau de droit de l'utilisateur. Peut être que ce n'est pas très correct non plus, mais je devrais dupliquer l'action en 3 fois (une pour le visiteur du profil, une pour l'utilisateur qui le modifie, une pour l'administrateur) ?

Ce qui me frustre un peu dans ZF2, c'est pas la création des formulaires en eux même, c'est que lorsque je créé un formulaire, je dois aussi créer un filtre, ajouter des lignes dans Modules.php, récupérer les filtres dans mon controller pour ensuite injecter les données dans le modèle (ce qui fait que je dois créer 2 fichiers, et dupliquer beaucoup de code pour créer un simple formulaire).
C'est d'ailleurs pour ça que j'utilise le service manager pour créer mes formulaires, un peu à la même façon que pour les modèles :
Je créé mon instance du formulaire, je lui passe l'input filter dans le service manager, puis dans le controller je n'ai qu'à récupérer l'instance du formulaire créé via le SM.

Hors ligne

 

#4 02-09-2013 10:22:36

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

Re: Formulaires, modèles et hydratation

En fait oui le fieldset c'est un composant qui représente un bout de formulaire réutilisable. C'est ça qu'il faut réutiliser parce qu'il a un sens par rapport à ton modèle.

On peut imaginer un utilisateur avec un profil associé et des droits associés au profil. Si tu fais un formulaire de façon classique tu vas avoir : (Le cas marche pas forcément mais c'est pour illustrer)
- Tous les champs que l'utilisateur doit remplir
- Une combobox select
- Une liste de checkboc pour saisir les droits
C'est assez long et surtout si tu veux réutiliser ce formulaire ailleurs en modifiant juste certains choses c'est très galère à faire.
Ce que tu fais c'est que tu vas créer plusieurs fieldsets. Comme ça si tu as besoin de modifié un profil tout seul tu as déjà un composant que tu n'as plus qu'à intégrer dans un formulaire pour le faire. Même chose pour un utilisateur. Ce qui va changer c'est les champs qui vont être affichés et/ou traités et ça tu le fais via un validationGroup directement dans le formulaire.

Si je reviens à mon formulaire, il va donc avoir en fieldset principal le fieldset utilisateur qui lui même contient le fieldset profil (le modèle utilisateur étant lié à un profil) qui lui même a un lien vers les droits (pour la même raison). Tu écris donc qu'une seule fois chaque fieldset que tu réutilises partout où tu veux.

Concernant les inputs tu as deux manières de faire soit via une fabrique, de ce que j'ai compris tu utilises les fonctions anonymes et c'est à éviter. Les fabriques c'est la même chose mais en plus propre. Dans cette fabrique tu vas effectivement passer l'inputfilter à ton formulaire dans le cas où l'inputfilter est assez complexe. Dans le cas d'un inputfilter simple tu peux le mettre directement dans le fieldset pour valider les champs du fieldset via inputFilterSpecification. Je t'encourage à aller bien lire la doc à ce sujet tu vas trouver pas mal d'exemples sur ce dont je viens de te parler.

Hors ligne

 

#5 02-09-2013 11:11:10

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

Re: Formulaires, modèles et hydratation

Ok je pense avoir compris, merci pour ces renseignements smile
Je devrais quand même créer plusieurs fichiers (un pour chaque formulaire, et un pour chaque fieldset que je récupère dans ces formulaires), mais je ne dois pas changer chaque fichier en cas de modification.

J'ai aussi vu pas mal de chose intéressantes dans la doc sur les formulaires que j'ignorais (avant je me basais sur le quickstart de ZF2 pour faire mes formulaires).

Au passage, je vois que certains mots de la doc sont en français, y aurait-il une doc française ? smile

Hors ligne

 

#6 02-09-2013 11:31:25

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

Re: Formulaires, modèles et hydratation

Non pas de doc française officielle pour l'instant. Elle a juste été rédigée par un français (pour une partie des formulaires).

Hors ligne

 

#7 02-09-2013 12:47:19

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

Re: Formulaires, modèles et hydratation

J'ai vu qu'il y a des "annotations" qui permettent de centraliser la création des éléments de formulaires, les filtres etc, mais je ne comprends pas vraiment ce que c'est, ni comment on s'en sert. C'est une autre façon de créer les éléments de formulaires ?

Hors ligne

 

#8 02-09-2013 14:09:31

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

Re: Formulaires, modèles et hydratation

Oui mais c'est pas la meilleure.

Hors ligne

 

#9 03-09-2013 18:18:38

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

Re: Formulaires, modèles et hydratation

Concernant le problème que j'avais avec l'input Date, j'ai vu en faisant un dump que les inputs avaient une propriété "priorityQueue", mais je ne trouve rien dans la doc à ce sujet, ne pourrais-je pas l'utiliser pour résoudre ce problème ? Faire en sorte que le validateur passe avant le filtre par défaut de l'élément Date ?

C'est possible d'afficher séparément chaque checkbox de l'élément multi-checkbox ? La doc montre comment afficher les autres éléments séparément, mais pas celui-ci.

Pour le 1er problème que j'avais avec "setValueOpttions", j''ai réussi à le contourner en utilisant le validateur "inArray".

Dernière modification par Seryus (03-09-2013 19:57:09)

Hors ligne

 

#10 03-09-2013 22:04:10

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

Re: Formulaires, modèles et hydratation

Salut alors les filtres sont bien passés avant la validation ça me parait même logique puisque dans la logique si tu soumets un input qui doit être rempli avec un espace et que tu mets le filtrer StringTrim, il va d'abord retirer les espaces pour ensuite faire la validation et retourner une erreur. Ton problème de date je n'ai pas trop de solutions, c'est comme partout si tu attends une date au format jj/mm/aaaa et que l'utilisateur saisi aaaa/mm/jj ça plantera à la validation.

Pour l'input date je ne m'en suis jamais servi par contre maintenant sur les formulaires tu as un composant date qui se met à jour en fonction de la locale qui est composé de 3 combobox (jours, mois, années).

Pour les checkbox tu dois pouvoir en faisant un foreach sur ton élément.

Hors ligne

 

#11 04-09-2013 12:59:42

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

Re: Formulaires, modèles et hydratation

Orkin a écrit:

Salut alors les filtres sont bien passés avant la validation ça me parait même logique puisque dans la logique si tu soumets un input qui doit être rempli avec un espace et que tu mets le filtrer StringTrim, il va d'abord retirer les espaces pour ensuite faire la validation et retourner une erreur.

Mais ça ça dépend des filtres et des validateurs. Pour les validateurs de l'élément Text je comprends qu'ils doivent s'exécuter après les filtres, par contre pour les éléments plus spécifiques comme l'élément Date, Number, etc ça me parait plus logique que les validateurs s'exécutent avant les filtres. Si tu regardes bien, lors de la validation du formulaire HTML5, il y a déjà des validateurs qui sont exécutés avant tes filtres PHP. C'est simplement qu'on peut les désactiver (car c'est coté client) ou que certains navigateurs ne le supporte pas encore.

Dans mon cas avec l'élément Date, il faut d'abord vérifier que l'utilisateur entre une date, avant d'essayer de convertir la date dans un format donné. Là le filtre passe avant, il essaie de convertir une valeur quelconque en une date, puis valide la date (alors que si le filtre est passé, on peut être sûr qu'il s'agit bien d'une date, plus besoin de mettre le validateur après). Mais si l'utilisateur n'a pas entré de date, ça lève une exception, plutôt que de lui dire "le champ attend une date au format aaaa-mm-jj".

Je pense que le composant formulaire est assez confus. Pour moi un élément de formulaire sous ZF2 n'est rien d'autre qu'un input filter avec des options. Habituellement (dans le cas des formulaires) le PHP sert à valider/filtrer les valeurs des formulaires HTML. Un formulaire en PHP n'a pas de sens.
En tournant les choses de cette façon, dans ZF2 on créé un élément de formulaire (autrement dit un ensemble de filtres/validateurs) pour ensuite lui rajouter un input filter (qui est aussi un ensemble de filtres/validateurs).
Ce serait plus simple si les formulaires ZF2 étaient de simple filtres, et qu'une aide de vue se charge de transformer ces filtres en formulaire html, en fonction des options choisies.

Par exemple :

Code:

[lang=php]
/* Création d'un formulaire (ensemble d'input filter) : */
<?php
$form = new Form();

$numberElement = new Element\Number(); // On créé le validateur "primaire" NumberFormat
$numberElement->setProperties(array( // Uniquement pour le HTML, il serait d'ailleurs plus logique de le mettre dans l'aide de vue.
    'name' => '',
    'class' => '',
    'id' => '',
));

$numberElement->setAttributes(array( // Les attributs sont des "sous validateurs"
    'min' => '', // On ajoute au validateur primaire le sous validateur LessThan
    'max' => '', // On ajoute au validateur primaire le sous validateur GreaterThan
));

$numberElement->setFilters(array( //Inutile ici mais c'est pour l'exemple
    array(
        'name' => 'Int', 
        'priority' => 1,
    ),
));

$form->add($numberElement);

/* Création du "vrai" formulaire HTML dans la vue */
echo $this->form($form);

/* qui affiche : */
?>
<input type="number" min="" max="" class="" id="" name=""/>

Cette façon me parait beaucoup plus claire, le développeur n'a pas à devoir créer les éléments de formulaire, puis créer les filtres tout est fait en une seule fois (et en plus la création de ces filtres ressemble beaucoup aux vrais formulaires HTML, on créé l'input, puis on lui met les attributs). Il y a les validateurs qui doivent s'exécuter avant tout le reste, puis les filtres/validateurs "secondaires" qui s'exécutent, en fonction de la priorité qu'on leur a donné.

Je m'éloigne un peu du sujet, mais c'est comme ça que je vois les choses smile

Hors ligne

 

#12 05-09-2013 00:35:54

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

Re: Formulaires, modèles et hydratation

Peut-on ajouter un validateur (et/ou une option d'un validateur) à un inputFilter d'un fieldset d'un formulaire en passant par le formulaire ?
J'essaie d'ajouter le validateur Db\NoRecordExists, mais il lui faut un adapter et je dois aussi lui passer l'id de l'utilisateur (pour exclure l'enregistrement contenant l'id). J'ai d'abord essayé de l'ajouter dès la création, mais pas moyen de le faire je bloque toujours sur un problème :
_ En essayant cette méthode de la doc qui implémente ServiceLocatorAwareInterface, je ne peux pas car mon fieldset implémente déjà une autre classe (InputFilterProviderInterface),
_ Avec l'autre méthode je ne vois pas comment passer un paramètre au constructeur du formulaire (car lui aussi à besoin de l'adapter et de l'id pour son validateur Db\NoRecordExists).

Peut-être que le fieldset peut récupérer ces infos du formulaire lui même ?

Hors ligne

 

#13 05-09-2013 09:40:54

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

Re: Formulaires, modèles et hydratation

Tu peux le faire en passant par une factory à laquelle tu passes au constructeur tout ce que tu as besoin. Soit tu fais la construction du formulaire depuis le constructeur soit depuis la fonction init() (dans ce cas il faudra penser à l'appeler manuellement).

Ensuite tu créés le fieldset à la main directement dans le formulaire : $this->add(new MonFieldetset($mesparams));

Hors ligne

 

#14 05-09-2013 19:28:04

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

Re: Formulaires, modèles et hydratation

Bon après de multiples essais je pense être arrivé pas loin du but :
J'ai réussi à créer mon formulaire via la factory et à passer l'adapter au constructeur. J'ai aussi créé le fieldset dans mon formulaire comme tu me l'as proposé, mais comme je lui passe un paramètre, je ne peux pas implémenter le fieldset de la classe InputFilterProviderInterface (sinon il me retourne une erreur comme quoi le paramètre est indéfini). Et il semble qu'à cause de ça, les validateurs que j'ai déclaré dans la méthode getInputSpecification() ne sont pas pris en compte lors de la validation du formulaire.
Une idée pour résoudre ce problème ?

Hors ligne

 

#15 05-09-2013 20:16:30

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

Re: Formulaires, modèles et hydratation

Oui c'est ça ! Tu peux appeler la méthode manuellement après ton new Fieldset()

Hors ligne

 

#16 05-09-2013 22:23:55

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

Re: Formulaires, modèles et hydratation

Hum j'étais déjà arrivé à ce résultat lors d'un des essaies que j'avais fait auparavant, mais après je ne vois pas quoi en faire de cette fonction. Elle ne fait que retourner un array. J'ai essayé de faire $form->getInputFilter()->add() mais ça ne fonctionne pas. Je pense qu'il faudrait ajouter l'inputFilter directement à l'élément fieldset, mais comment ? Pas de méthode ->setInputFilter() pour le fieldset hmm

Hors ligne

 

#17 05-09-2013 22:45:33

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

Re: Formulaires, modèles et hydratation

ah oui tu as raisons je t'ai dit une bêtise. Il me semble que la doc officielle en parle. Sinon tu peux essayer de retrouver la fabrique qui sert pour les fieldset et voir ce qui est fait avec le getInputSpecification()

Hors ligne

 

#18 05-09-2013 23:07:24

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

Re: Formulaires, modèles et hydratation

J'ai déjà regardé, il appelle une méthode "createInputFilter" de la factory inputFilter. J'ai essayé de l'utiliser sur l'inputFilter avant et après l'avoir ajouté au formulaire, mais sans succès. Il me semble que j'étais tombé sur le même résultat en suivant les indications de la doc, qui montre comment passer le serviceLocator au fieldset.

Hors ligne

 

#19 05-09-2013 23:52:53

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

Re: Formulaires, modèles et hydratation

En suivant ici ça devrai le faire http://framework.zend.com/manual/2.2/en … -extension

Implémentes la méthode getInputFilter() qui créé tes inputfilter.

Hors ligne

 

#20 06-09-2013 01:31:40

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

Re: Formulaires, modèles et hydratation

Je ne comprends pas ce que tu veux dire, dans le lien que tu m'as refilé ils montent comment créer les éléments, pas les filtres.
J'ai quand même fini par trouver une solution, je ne sais pas si c'est très propre mais ça marche big_smile
J'ai continué à "feuilleter" la classe Form pour voir comment ils ajoutaient les filtres des fieldset, et voilà ce que j'ai trouvé :

Code:

[lang=php]
$spec = $childFieldset->getInputFilterSpecification();
$filter = $inputFactory->createInputFilter($spec);
$inputFilter->add($filter, $name);

où $name est le nom du fieldset.
À noter que ça n'a l'air de fonctionner que si l'inputFilter a été créé par la factory (ou peut être que je m'y prends mal).

Hors ligne

 

#21 06-09-2013 09:42:37

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

Re: Formulaires, modèles et hydratation

En fait dans le lien il y a surtout la partie qui parle de lazy loading de l'input filter. Sinon de mémoire tu peux le rajouter dans le getInputFilterSpecification du formulaire de la manière suivante (j'ai pas testé mais ça fonctionne comme ça pour les validations group)

return array(
'nomdufieldset' => array(
'nominput' => array(...)
)
)

Hors ligne

 

#22 06-09-2013 09:49:34

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

Re: Formulaires, modèles et hydratation

J'ai encore une question concernant les formulaires, quand tu me disais qu'il était préférable de créer mon formulaire grâce à la fabrique, je l'ai créé comme ça :

Code:

[lang=php]
public function getFormElementConfig()
{
    return array(
        'factories' => array(
            'myForm' => function($sm) {
                return new myForm($sm->getServiceLocator()->get('dbAdapter'));
            },
        ),
    );
}

C'est bien ce que je devais faire non ? Parce que j'ai aussi vu qu'on pouvais créer le formulaire avec la méthode $factory->createForm($array).

Aussi dans le quickstart j'ai vu qu'ils ajoutaient les inputFilter de cette façon :

Code:

[lang=php]
$inputFilter->add($factory->createInput($array))

mais je le fais comme ça et ça fonctionne très bien :

Code:

[lang=php]
$inputFilter->add($array)

Y-a-t-il un avantage à utiliser l'autre méthode ?

Edit : Non j'avais déjà essayé comme ça, mais ça ne fonctionnait pas smile

Edit 2 : En faisant des recherches sur les fabriques, je suis tombé sur cet article, qui explique qu'il est mieux d'utiliser une classe factory, plutôt que d'utiliser une fonction callback pour les fabriques. Ça voudrait dire qu'il est mieux de créer, pour chaque référence dans la fabrique, une classe qui implémente FactoryInterface ?

Dernière modification par Seryus (06-09-2013 16:00:36)

Hors ligne

 

#23 07-09-2013 12:15:49

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

Re: Formulaires, modèles et hydratation

Seryus a écrit:

_ En essayant cette méthode de la doc qui implémente ServiceLocatorAwareInterface, je ne peux pas car mon fieldset implémente déjà une autre classe (InputFilterProviderInterface)

En faite c'était super simple, cette méthode fonctionne très bien et elle est à mon avis plus propre que celle que j'ai trouvé par la suite, j'ignorais simplement qu'on pouvait implémenter de 2 classes, en séparant chaque classe d'une virgule.
Résultat, je n'ai même plus besoin d'utiliser la fabrique, je peux simplement déclarer la classe dans "invokables" et le tour est joué.

Je me pose néanmoins quelques questions sur la fabrique maintenant. Dans ZF2 il y a le serviceManager principal, puis plusieurs autres "enfants" serviceManager. Chacun à sa propre fabrique, mais les enfants héritent des éléments du SM principal.
Dans le cas des éléments de formulaires, il y a l'enfant qui récupère sa config dans getFormElementConfig() (ajouté à partir de ZF2.1 d'après ce que j'ai pu lire).
J'ai actuellement plusieurs formulaires sur mon site, et j'utilisais auparavant le SM principal pour les déclarer dans "invokables" (dans getServiceConfig()). Ça ne serait pas mieux de les déclarer dans "invokables" de getFormElementConfig() ?
Ou bien ce n'est que pour les éléments des formulaires ? À part pour la clarté du code, il a-t-il d'autres avantages à utiliser les SM enfants ?

Je n'ai pas trouvé d'explications en détail de ces "SM enfants", ce qu'ils font de plus par rapport au SM principal, simplement des exemples d'utilisation (lors de la création de ViewHelper ou de la création d'éléments de formulaire personnalisé). Auriez-vous un lien et/ou une explication à me fournir ?

Hors ligne

 

#24 09-09-2013 09:54:45

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

Re: Formulaires, modèles et hydratation

Seryus a écrit:

Edit 2 : En faisant des recherches sur les fabriques, je suis tombé sur cet article, qui explique qu'il est mieux d'utiliser une classe factory, plutôt que d'utiliser une fonction callback pour les fabriques. Ça voudrait dire qu'il est mieux de créer, pour chaque référence dans la fabrique, une classe qui implémente FactoryInterface ?

Oui c'est mieux de faire comme ça, ça permet de mettre en cache la config.

Seryus a écrit:

J'ai actuellement plusieurs formulaires sur mon site, et j'utilisais auparavant le SM principal pour les déclarer dans "invokables" (dans getServiceConfig()). Ça ne serait pas mieux de les déclarer dans "invokables" de getFormElementConfig() ?
Ou bien ce n'est que pour les éléments des formulaires ? À part pour la clarté du code, il a-t-il d'autres avantages à utiliser les SM enfants ?

En fait les deux fonctionnent, la différence entre les deux méthodes c'est qu'en utilisant le SM spécialisé tu es certains de récupérer un objet de la bonne instance. Si on prend l'exemple des formulaires via le FormElementManager tu seras sûr de récupérer un objet de type formulaire ce qui n'est pas le cas avec le ServiceManager de base.

Ensuite il y a quelque chose de pas très clair dans tout ça. En effet lorsque tu vas utiliser une fabrique pour créer un formulaire le Service Locator qui t'es passé en paramètre sera en fait un FormElementManager donc si tu veux accéder à un service, à l'orm etc ... Il te faudra faire $serviceLocaror->getServiceLocator() pour récupérer celui de base.

PS : Finalement tu en auras appris des choses cette semaine wink

Hors ligne

 

#25 09-09-2013 12:16:12

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

Re: Formulaires, modèles et hydratation

Orkin a écrit:

En effet lorsque tu vas utiliser une fabrique pour créer un formulaire le Service Locator qui t'es passé en paramètre sera en fait un FormElementManager donc si tu veux accéder à un service, à l'orm etc ... Il te faudra faire $serviceLocaror->getServiceLocator() pour récupérer celui de base.

Oui je suis tombé sur ce problème, mais en cherchant un peu je suis tombé sur un article qui expliquait en gros le fonctionnement du SM, ça dépend de l'endroit où on a déclaré la factory (getServiceConfig(), getFormElementConfig(), etc).

Orkin a écrit:

PS : Finalement tu en auras appris des choses cette semaine wink

Oui et encore je n'ai pas tout dit ici big_smile
J'utilisais ZF2 depuis un moment, mais en faite je ne faisais vraiment pas ce qu'il fallait. Je trouve que la doc n'est pas assez claire (on trouve en général mieux ailleurs) et elle contient des erreurs (peut être que ce sont des oublies des versions précédentes ?). Du coup je me basais (trop) sur le quickstart, qui en faite ne montre vraiment rien de l'utilisation de ZF, et ne montre pas comment bien utiliser le framework. Je savais que la flexibilité de ZF2 était à la fois son point fort et son point faible, mais j'étais loin de m'imaginer à ce point là smile

Je suis d'ailleurs en train de refaire entièrement mes modèles (et mon fichier Module) pour utiliser des hydrators commun pour mes modèles et formulaires, mais j'ai l'impression que ça a été rajouté très récemment (dans la version 2.2 pour cette partie par exemple) et du coup à part la doc, il n'y a rien dessus (enfin sur ce que j'essaie de faire, on peut trouver sur les hydrators en général, mais c'est vraiment bref; les gens préfèrent  se tourner vers Doctrine).

Ce qui m'amène à une autre question : est ce qu'on peut faire en sorte que notre objet resultSet hydrate un objet de la même façon que le font les formulaires (avec les relations OneToMany, ManyToMany, etc) ?
J'aimerai pouvoir hydrater une propriété du type Auteur, en hydratant mon objet Article à partir d'une requête avec jointure (et récupérer les infos sur l'auteur en utilisant par exemple $article->getAuteur()->getName()). Et tout ça en utilisant l'hydrator de ZF2 smile (il me semble que Doctrine le fait très bien, mais j'aimerai m'en passer pour le moment).

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