Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-04-2014 17:02:39

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

FormCollection personalisé: résultat étrange

Bonjour,

Je me suis fait mon propre Helper "formCollection", mais j'ai un résultat très étrange lors de la récupération de la valeur d'une propriété de l'élément dans la methode render:

Code:

[lang=php]
  public function render(ElementInterface $element)
    {
        // [...]
        $isBase = $element->getOption('use_as_base_fieldset');
        if($isBase === false){ 
            $this->setWrapper('<div class="columns"><fieldset%4$s>%2$s%1$s%3$s</fieldset></div>');
        } else{
             $this->setWrapper('<fieldset%4$s>%2$s%1$s%3$s</fieldset>');
        }
        // [...]
}

Il rentre toujours dans la première condition.
J'ai crue d'abort qu'il ne parvenai pas a récupérer la valeur de l'options "use_ase_base_fieldset", mais vous allez comprendre pourquoi je dit que le résultat est très étrange:

si dans la condition je met:
  if($isBase ===  true){


Le résultat est strictement le même !

comment le résultat de getOption('use_as_base_fieldset') peut être a la foi faux et vrai? xD

ya une subtilité rigolote qui m’échappe...

Hors ligne

 

#2 15-04-2014 17:10:10

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

Re: FormCollection personalisé: résultat étrange

Salut, as-tu vraiment besoin de tester le type de $isBase ?? parce que pour ton test if (!$isBase) { ... } suffirait wink.

Hors ligne

 

#3 15-04-2014 17:17:06

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: FormCollection personalisé: résultat étrange

et si tu affiche le résultat avec un truc comme var_dump($isBase);
Il t'affiche quoi?

Hors ligne

 

#4 15-04-2014 18:51:52

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

Salut,

pfouuu !
Gros mélange deux noeud hard core Hevy brek bits man !

En faite:
j'ai fait des fieldset de test qui s'imbrique, mais je l'ai fait un peut trop à la rache, avec certain qui appel d'autre déjà appeler plus haut, bref, je ne sais pas ou j'ai fait un noeud mais sa la fait plané a 15 000. J'arrivai même pas a voir le résultat d'un echo...(dailleur comment est-ce possible?)

J'ai fini par refaire une hiérarchie plus propre pour tester tout autre chose en attendant votre aide et paf, maintenant que je réessaye, changer la condition me change bien le résultat x) (comme quoi faut soigné ses environnement de test xD )

En revanche il semblerai que la propriété privé $wrapper ne sois appeler qu'a la toute toute fin, une seul foi, alors que la méthode render s'exécute pour chaque fieldset de la hiérarchie, et cela bien en amont, du coup, $wrapper prendra la valeur du dernier fieldset...pour tout les fieldset >.<
 
Se qui nous amène a la question suivante:

-> Mais ou c'est donc que c'est que la méthode getWrapper est appeler, dit donc? comprend pas encore bien comment sa marche les aide de vue moi.

Par contre tout autre chose qui pourrai faire l'objet d'un autre topic:

-> Je pensais que si on m'était l'options "use_as_base_fieldset" à vrai à l'ajout d'un fieldset dans un autre fieldset, quelque chose comme:

<input name="form[parentFieldset][childFieldset][field01]" /> deviendrait -> <input name="form[parentFieldset][field01]" />

Mais non, sa marche pôs -.-

le set_as_base_fieldset n'est utilisé qu'au niveau du formulaire? si oui, comment faire dans mon cas? (doit-je ouvrir un nouveau topic? ^) Me dite pas que c'est pas possible car je viens de basé toute une méthodologie la dessus ^^ (pour la génération du DOM, la gestion des ValidationGroupe(), ect)


, as-tu vraiment besoin de tester le type de $isBase ?? parce que pour ton test if (!$isBase) { ... }  } suffirait wink.

Je sais bien, mais c'était pour être certain que $isBase n'était pas égal a NULL ou a 0 ou a une chaine vide, ce qui aurai pue expliquer pourquoi j'avais toujours le même résultat smile

Dernière modification par Splyf (15-04-2014 18:55:09)

Hors ligne

 

#5 16-04-2014 09:19:08

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

Re: FormCollection personalisé: résultat étrange

Dans le cas où $isBase est NULL, égal à 0 ou chaine vide ça renvoi false sur un test.

Le use_as_base_fieldset sert dans le formulaire pour indiquer quel type d'entité le formulaire renvoi. Donc tu ne le met qu'une fois pour qu'il te retourne (si c'est un fieldset lié à l'entité utilisateur) un utilisateur ensuite tous les fieldset imbriqué dans un fieldset servent pour les relations entre l'entité utilisateur et d'autres entités.

Concernant les aides de vue je vois pas trop ce que tu comprends pas dans le fonctionnement ? C'est en gros une fonction que tu peux appeler dans la vue en fonction de tes besoins.

Hors ligne

 

#6 16-04-2014 09:51:46

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

Bonjour,

Donc sa veut dire que une entité => 1 seul field set? pas moyen de le découper en plusieurs? sad
Prenons un exemple: 

Une table dont une partie des champs peut être vue et édité par un type d'utilisateurs, une autre partie par un autre type d’utilisateurs, puis un 3eme type d'utilisateurs(un admin au hasard ^^) qui peut éditer les deux parties...pour ce dernier je doit refaire un 3eme fieldset?? j'aimerai pouvoir faire un 3eme fiedset mais qui à comme élément les deux autres.
Ceci est un exemple mais je peut en trouver plein d'autre, pense tu que c'est une erreur de conceptions ? (ou est-je encore raté quelque chose ?)

Pas possible? Ou alors je doit passé par d'autre classe, qui ne sont pas des fieldset ni des élément mais qui me retournerai les tableau de donné pour construire les champs? bof bof :s

Ce que je ne comprend pas dans l'aide de vue, dans le cas du formCollection par exemple, on a la methode render() qui construit la chaine, mais pas la totalité de la chaine, je ne vois getWrapper() null part et c'est lui qui retourne la string contenant le <fieldset>%s</fieldset>.
Il y a une autre classe qui gère l'affichage de formCollection?

EDIT : autre exemple:
Admétons une table etablissements, contenant description, adresse, caractèristique
Une table restaurant comprend des caractèristique suplémentaire, et hérite de établissement.
Je veut regrouper les caractéristiques de la partie établissement(ex: accept_CB, accept_chequeVac) et de la partie restaurant (ex: acces_handicape, acces_wifi,ect) en un seul fieldset à part, pour deux raison:
- je veut qu'au niveau du DOM, les champs correspondant au caractéristique des deux tables sois regroupe dans le même <fieldset>, sans avoir besoin de réécrire ->formRow('element') pour chaque element simpelement pour une simple réorganisation, alors qu on pourrai ainsi écrire un seul et unique formCollection avec cette solution
- Je veut simplifier au max l'utilisation du validationGroup(). Avec cette solution, je ne suis pas oblité de réécrire tout les champs alors qu'il n'y en a qu'un seul que je ne veut plus validé...

Ainsi, je peut faire un fieldset "caracterisitiqueEtablissement" et un caracteristiqueRestau", puis je les regroupe dans un autre, ou j'en prend un, ou l'autre, ect me permetant ainsi de controller aisément mes champ par groupe, au lieu de créer 10 000 fieldset smile

Dernière modification par Splyf (16-04-2014 10:10:59)

Hors ligne

 

#7 16-04-2014 10:39:19

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

Re: FormCollection personalisé: résultat étrange

Je pense que tu n'as pas du tout compris le principe d'un fieldset et de l'aide de vue formCollection hmm.

Une fieldset c'est une représentation d'une entité sous forme de formulaire (ou du moins d'un morceau de formulaire). C'est tout ! Il va s'occuper de définir tous les champs de l'entité et la façon de les valider/filtrer.
Lorsque ton entité a une relation avec une autre entité (OneToMany, ManyToOne ou ManyToMany) tu créés un autre fieldset qui est utilisé dans le fieldset parent. Par exemple tu as un entité utilisateur qui a une relation vers une entité adresse. Un utilisateur peut avoir une ou plusieurs adresses et c'est là que tu fais une collection de fieldset lié à l'entité adresse. Si l'utilisateur a 3 adresses tu auras donc 3 fieldset dans le fiedlset utilisateur (c'est faut automatiquement hein, tu le fais qu'une fois en type collection et ça se débrouille tout seul).

Donc avec mon exemple tu as 2 fieldsets : un fieldset utilisateur et un autre adresse. Lorsque tu vas vouloir gérer l'édition d'un utilisateur en fonction du type de l'utilisateur tu vas créer un formulaire UpdateUserForm où dans celui-ci tu ne permettra pas la modification du login. Tu auras le fieldset utilisateur en fieldset de base pour ce formulaire et dans ton formulaire tu vas définir un velidationGroup qui ne contient pas le login, de cette façon tu ne le traites pas. Par contre dans la partie admin tu vas utiliser un autre formulaire UpdateAdminUserForm qui lui permet la modification du login ton formulaire ressemblera en tout point à celui d'avant avec pour différence dans le validationGroup le traitement du champ login.
Il faut garder en tête qu'un formulaire c'est fait pour une action précise contrairement aux fieldset qui sont fait pour être réutilisés.

Si on prend ton exemple t'as un problème de conception puisqu'un restaurant est un établissement. Alors après on peut effectivement dire qu'un établissement contient par exemple un restaurant et un hotel donc tu peux avoir 2 approches différentes. Dans le cas où un restaurant est un établissement tu vas avoir de l'héritage donc tu utiliseras le fieldset du restaurant qui devrait étendre celui d'établissement avec tous les champs que tu veux. Dans ce cas à la validation de ton formulaire celui-ci de retournera une entité restaurant et non pas établissement + restaurant.
Dans le cas où tu peux avoir plusieurs type d'établissement dans un établissement (ça fait un peu inception mais bon :p). Tu vas avoir un fieldset de base qui est l'établissement avec une collection de fiedlset de sous établissement (ou dans le cas où c'est défini un fieldset restaurant et un autre hotel). Tu auras donc une jointure au niveau BDD entre établissement et restaurant, et, établissement et hotel c'est donc des fiedlset séparés et lorsque ton formulaire sera validé tu vas récupérer une entité établissement avec dans l'attribut restaurant une entité restaurant et dans hotel une entité hotel.

Logiquement t'es censé créer un fieldset par entité après ça se configure au niveau du formulaire avec des validationGroup.

Concernant l'aide de vue formCollection elle sert juste à afficher des collections de fieldset (que tu as logiquement uniquement lors d'une relation OneToMany ou ManyToMany) et que tu as d'un baseFieldset vers d'autre fieldset.

Hors ligne

 

#8 16-04-2014 11:15:59

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

woua ok, grosse erreur de conception en effet.
En faite je l'avais bien comprise mais sa m'embêtai tellement de réecrire toute la vue avec des formRow plutôt qu'un simple "formCollection", simplement pour réorganisé le dom que je me suis empressé de tout oublié xD

et puis si j'utilise un même formulaire dans plusieurs vue, je voullai évité d'avoir a repassé sur tout a l'ajout / modification / supression de champ...mais du coup je suppose qu'il faille que je me tourne toute bêtement sur les vue partiel x).

Bon,je revois ma conception (heureusement que je fait des essais avant de fonçer tête baissé, c'est pour refondre un gros projet d'envergure! )

Edit:
Pour les validations groupe, si dans une vue je n'ai qu'un seul champs en moins du formulaire, pour le moment je fait sa dans le controller:

$form->setValidationGroup([
champ1, champs2, champ3,[fsChamp1.1, fsChamp1.2]
])

Je trouve sa très lourd, surtout pour la maintenance ! comment dire simplement "validé tout sauf le champ x ?"

Dernière modification par Splyf (16-04-2014 11:19:44)

Hors ligne

 

#9 16-04-2014 11:29:17

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

Re: FormCollection personalisé: résultat étrange

Le validationGroup est à mettre directement dans le formulaire (ça évite d'être tenté de l'utiliser partout) et tu ne peux pas. Par contre lis un peu la doc sur le validationGroup parce que configuré comme ça c'est pas censé fonctionner wink.

Hors ligne

 

#10 16-04-2014 11:36:17

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

heu oui pardon j'ai pas relut et pas encore l'abitude c'était juste pour imager mon propo ^^

Bon ok!

Pour être d'avoir bien compris:
jai une vue a avec tout les champ dun fieldset, je fait un formulaire A
jai une autre vue avec quelque champ en moins dun fieldset, je fait un formulaire B?

Hors ligne

 

#11 16-04-2014 11:47:39

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

Re: FormCollection personalisé: résultat étrange

Pour faire simple oui après il y a toujours des exceptions. Mais en gros tu as une page d'ajout c'est un formulaire, une d'édition c'est un autre etc ...

Après on peut imaginer que la page d'édition soit la même si t'es admin ou utilisateur classique donc là c'est un cas un peu plus spécifique et tu es obligé de définir le validationGroup ailleurs. Personnellement je préfère recréer un formulaire comme ça je me prend pas la tête parce que en général dans un formulaire en fonction de ce que tu fais tu as des validateurs en plus :
En création de compte tu vas t'assurer que le login et le mail n'existent pas déjà alors qu'en mise à jour tu t'assures qu'ils sont unique, si tu vérifies qu'ils n'existent pas ça se validera jamais car ils existent vu que tu modifies l'utilisateur en question (et t'as pas forcément envie de modifier son mail ou son login à chaque fois wink).

Hors ligne

 

#12 16-04-2014 12:46:00

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

en création de compte tu vas t'assurer que le login et le mail n'existent pas déjà alors qu'en mise à jour tu t'assures qu'ils sont unique

Tu veut dire que pour un update et un insert, tu creer deux formulaire différent?
Sa devient pas un peut lourd pour la maintenance après?

Dans un avenir assez proche le projet en question va évoluer très rapidement, (d'ou le choix de le refondre sur un framework mvc solide ^^) et je veut réduire un max les taches a chaque ajout / supression d'un champ dans la bdd

Hors ligne

 

#13 16-04-2014 13:29:59

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

Re: FormCollection personalisé: résultat étrange

Si c'est un peu chiant mais c'est le plus propre. Tu fais pas les mêmes vérifications donc comme les validateurs sont liés aux fieldsets/formulaire t'as pas trop le choix et faire ça dans le contrôleur c'est pas propre puisque tu dois passer l'entity manager (dans le cas de doctrine) hors l'entity manager n'a rien à faire dans le contrôleur wink

Hors ligne

 

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

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

Mhhhhh,Dans ce cas:
(pas taper si c'est du grand n'importe quoi je début en MVC ^^ )

dans le formulaire on rajoute une variable $mode, par default sur "INSERT"
a l'insertion:

$form = new App\Form\MyForm('UPDATE' )
puis dans le formulaire, selon la valeur de $mode, on ajoute ou pas un élément, on choisi tel ou tel validateur, ce qui nous permet ainsi de n'écrire qu'une foi pour toute la définition d'un champ !!

Par contre, je ne sais pas encore comment faire avec le FormManager, peut on lui dire de passé des paramêtre lorsqu'il initie un formulaire, ou qu'il appelle la méthode init() ?

(--> factory? )

Hors ligne

 

#15 16-04-2014 15:06:48

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

Re: FormCollection personalisé: résultat étrange

T'es obligé de passer par une fabrique oui. Mais dans ce cas tu dois en faire 2 donc autant faire 2 formulaires wink.

Hors ligne

 

#16 16-04-2014 16:24:57

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: FormCollection personalisé: résultat étrange

Mhhhh okay!

dans le cas d'un formuaire qui a 20 champ et qui na comme seul différence entre l'insert et l'update qu'une ou deux validateur, je pense que cest quand meme plus simple pour la maintenance de passé par les fabrique :p

merci en tout cas pas mal de chose son devenu bien plus clair!

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