Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Form
Zend_Form Forum d'entraide pour le composant Zend_Form du Zend Framework (création de formulaires, helpers, AJAX etc.). Avant de poster -> FAQ Zend_Form.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/05/2008, 19h50   #1
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Par défaut Compréhension et utilisation des Décorateurs

Bonjour à tous!!!!!!!

Désolée pour la question mais je tente de lire la doc sur Zend framework; malheureusement sur le site en français la partie Zend_Form est en anglais et j'ai plus de mal

Je ne comprends rien aux Decorators!!!!!

JE NE COMPRENDS PAS A QUOI ILS SERVENT

JE NE COMPRENDS PAS QUEL EST SON UTILISATION LA PLUS UTILE (normal puisque je ne comprends pas à quoi ils servent)
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h19   #2
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
J'ai compris ....

par contre tout conseil sur leur utilisation la plus efficace je suis prennante...

merci!!!
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h31   #3
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par Garra Voir le message
JE NE COMPRENDS PAS A QUOI ILS SERVENT
Ils servent aux éléments (zone de saisie, boutons radios, cases à cocher, etc.) que tu as définis dans ton Zend_Form a se "dessiner" ("render" en anglais) eux-mêmes dans une vue, c'est à dire produire le code HTML leur correspondant sans que tu aies quoi que ce soit d'autre à faire que de les déclarer. Ils gèrent également l'affichage des messages d'erreurs issus de la validation du formulaire (si des Validateurs ont été déclarés pour les éléments du formulaire).

Leur utilisation est optionnelle : tu peux très bien te servir d'un Zend_Form uniquement pour valider les données d'un formulaire utilisateur, et écrire toi-même le code HTML de ce formulaire.

Le nom de "Décorateur" leur vient du patron de conception (Design Pattern) "Decorator" selon lequel ils ont été conçus par les développeurs de Zend.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 16h10   #4
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Merci!!!

Si j'ai bien compris du moment où j'utilise Zend_Form pour faire du par exemple:

Code :
1
2
3
4
        $legend_uk = new Zend_Form_Element_Text('legend_uk');
        $legend_uk->setLabel('Légende UK');
        $titre_uk = new Zend_Form_Element_Text('titre_uk');
        $titre_uk->setLabel('Titre UK');
ceci veut dire que je suis obligée de passer par les decorators pour les insérer par exemple dans une div?

les questions sont:
1: J'aimerais pouvoir insérer ces input (4) dans une seule div, comment faire?
2: Puis-je créer mon xhtml directement et puis y insérer ces inputs? Et comment on fait?
3: Dois-je obligatoirement le faire directement dans ma classe Form ?

Voili les questions que je me pose.

merci!!
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 08h47   #5
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
1: J'aimerais pouvoir insérer ces input (4) dans une seule div, comment faire?
Si ces 4 éléments sont les seuls éléments de ton formulaire tu peux ajouter : $this->addDecorator(('HtmlTag'), array('tag' => 'div', 'class'=>'test')); ce qui donnera : <form><div>...</div></form>. Sinon, tu peux utiliser un Groupe et ajouter de la même façon un décorateur <div> à ton groupe

2: Puis-je créer mon xhtml directement et puis y insérer ces inputs? Et comment on fait?
Ben là j'ai pas trop compris ce que tu veux dire. Mettre du html directement tel quel dans tes éléments ? Oui, c'est ce que je fais. J'ai laissé tomber l'usage des décorateurs de ZF, trop compliqué pour mon cerveau. J'ai créé mes propres décorateurs et je balance dedans le html que je veux (à savoir des tableaux dégueulasse). Et idem pour les groupes. Comment faire ? Dans la doc en ligne, tu verras un exemple sur la création d'un décorateur nommé Composite. Il est basique et excellent pour comprendre les décorateurs. Tu verras la méthode Render() : c'est là que tu vas mettre ton html.

3: Dois-je obligatoirement le faire directement dans ma classe Form ?
Si tu veux utiliser les zend_form, cad valid(), populate(), oui. Enfin, je crois.

Franchement à partir du moment ou j'ai créé mes décorateurs mettant en forme mes éléments comme je le souhaitais, j'ai été ravi des Zend_Form. Sinon, ça m'a fait déprimé ces histoires de <dt><dd> htmlTag, serieux, trop compliqué pour mon petit cerveau.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 09h34   #6
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
Envoyé par whitespirit Voir le message
Franchement à partir du moment ou j'ai créé mes décorateurs mettant en forme mes éléments comme je le souhaitais, j'ai été ravi des Zend_Form. Sinon, ça m'a fait déprimé ces histoires de <dt><dd> htmlTag, serieux, trop compliqué pour mon petit cerveau.
C'est vrai que pour des formulaires complexes, ça devient vite inextricable... Je les ai abandonnés complètement pour une autre raison, c'est qu'il s'agit de purs artefacts de présentation donc pour moi d'une intrusion de la couche Vue dans la couche Contrôle. J'utilise les Zend_Form uniquement pour de la validation et du filtrage, et c'est pour moi déjà très bien.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 11h54   #7
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Je vous remercie tous les deux!!!!

Je fais un petit back-office d'admin et j'ai voulu approfondir le Zend_Form mais vous avez raison ça a l'air trop complexe pour pas grand chose cette histoire de decorators, donc je vais finir comme cela pour cette admin mais je crois que pour mon prochain projet Zend je reviendrai à notre cher XHTML direct.

Merci, votre aide a été super importante!!!!!
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 13h54   #8
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
Citation:
Envoyé par GrandFather Voir le message
Je les ai abandonnés complètement pour une autre raison, c'est qu'il s'agit de purs artefacts de présentation donc pour moi d'une intrusion de la couche Vue dans la couche Contrôle.
Ah Enfin quelqu'un qui pense comme moi. Je m'en sens moins seul.
Tout à fait d'accord sur cette analyse ! C'est une intrusion d'une couche dans une autre.
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 15h23   #9
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
D'accord

Bon , voilà ce qui me manque alors:
Supposons que je vais vers votre conseil (je suis en train de le faire) et de créer directement mon XHTML avec ma forme, etc, etc.

Dans mon controller, comment j'accède à une forme x?

Car pour la vue pas de problème $this->view->trucmuche

alors pour une forme???

car je voudrais ajouter dynamiquement un input hidden puis faire un isValid sur ma forme, etc; etc, etc.

Comment fait-on?


merci
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2008, 20h20   #10
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
D'accord j'ai compris que ce n'est pas possible ....

Mais lorsqu'on a Zend_Form c'est vrai que les decorators et les validators permettent d'afficher tout de suite un message lorsque par ex: on ne saisit pas une valeur obligatoire ou des choses du genre.

Comment simulez-vous ce comportement sans Zend_Form?
Car il faut reconnaître que pour cela c'est bien utile.

C'est dômmage ou je n'ai pas tout compris encore....

merci
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 09h31   #11
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Je vais te montrer comment j'utilise les zend form, sachant que ce n'est que mon utilisation.

Je créer un formulaire de cette façon:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class FonctionForm extends TemplateForm 
{ 
 
    public function __construct(...) 
    { 
    	parent::__construct(..)
	$titre_identite	  = new eltTitre('TITRE_IDENTITE',"Fonction des collaborateurs ");
 
        $id_fonction	= new eltIdentifiantDisabled('ID_FONCTION');
        $nom			= new eltNom();        
        $description	= new eltDescription('DESCRIPTION');  
 
		$this->addElements(array($titre_identite, $id_fonction,$nom,$description));         
			        //	ORDRE D'AFFICHAGE	
		$this->TITRE_IDENTITE->setOrder(50); 
		$this->ID_FONCTION->setOrder(51); 
		$this->NOM->setOrder(130); 
		$this->DESCRIPTION->setOrder(132); 
    } 
}
A savoir que TemplateForm est mon template de formulaire, j'y ai mis les éléments génériques à tous mes formulaires : les boutons ajouter, modifier, supprimer..., les classes, label, etc. Comme je t'ai dit, j'ai créer mes propres éléments avec mes décorateurs (eltNom, eltDescription, etc.) qui mettent en forme xhtml les éléments.

Dans mon controlleur, j'initialise dans chaque init() la form qui sera utilisé comme par exemple :
Code :
$this->formulaire = new TicketForm();
Par exemple, dans l'action modifierAction j'ai ce code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.......
            $id = (int)$this->_request->getParam('id', 0);
    	    if ($id > 0) 
    	    {    	    	
    	    	$this->zf_table->fetchAll();
    	    	$row =  $this->zf_table->fetchRow('ID_TICKET ='.$id);    	        
 
//===========================================================
//		INITIALISATION DU FORMULAIRE AVEC LES VARIABLES 		
//===========================================================
$this->formulaire->HIDDEN->setValue($id);
				$this->formulaire->ID_TICKET->setValue($row->ID_TICKET);
				$this->formulaire->LOCATION->setValue($row->ID_LOCATION);
				$this->formulaire->TYPE_TICKET->setValue($row->ID_TYPE_TICKET);
.....
$this->view->formulaire = $this->formulaire; //--je passe le formulaire à la vue
J'initialise les variables de mon formulaire.

Lorsque, par exemple je récupère les infos de mes formulaires avant d'insérer dans ma base (le getPost me retourne le 'name' de l'élément dans le formulaire :
Code :
1
2
3
 $data = array(	
'ID_LOCATION'		=> 	trim($filter->filter($this->_request->getPost('LOCATION'))),
'ID_TYPE_TICKET'	=> 	trim($filter->filter($this->_request->getPost('TYPE_TICKET'))),
Maintenant voici le code de toutes mes actions ajouter, modifier, détail
Code :
1
2
3
4
<?php 
//-- Affiche le formulaire --//
echo $this->formulaire;
?>
Tu vois l'avantage des formulaires ? Pour un affichage un controlleur = une table, je n'ai plus besoin d'écrire le code des vues ajouter,modfier, détail, supprimer. Bon, j'ai mis du temps avant de définir et trouver une structure qui me convienne: 2 semaines pour comprendre les formulaires et écrire le code.

Du coup je ne sais pas si je réponds à tes interrogations mais sache que les formulaires s'utilise de façon copier-coller sans modifier grand chose. Je te conseil vraiment, si tu as beaucoup de formulaire à comprendre leur fonctionnement avant de te décider si tu gardes ou non Zend_Form.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 14h21   #12
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Je te remercie
Au debut c'est vers cette façon de travailler que j'y suis allée... mais je trouve qu'on s'éloigne trop du XHTML et que finalement gérer un simple formulaire avec 3 champs et 2 bouttons devient une usine à gaz.

Le seul avantage que j'avais trouvé c'est le fait de contrôler tout de suite la saisie et d'afficher un message et c'est un très bel avantage mais pour le reste.....

Je me trompe peut-être et ce serait bien que ce post serve à que d'autres personnes donnent leur avis et expérience sur le sujet car ça a l'air d'être une décision à prendre dès le début du projet et entraine deux façons très différentes de travailler.

Moi c'est mon premier projet sur Zend et j'ai gouté aux deux façons de faire sans encore me rendre compte de quelle est la bonne, la meilleure, la plus propre, la plus allant vers le HTML du futur (HTML 5?), la plus efficace, peformante, etc, etc.

Tout commentaire est le bienvenu!!
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 14h39   #13
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229

whitespirit
Peux tu me montrer un exemple de tes classes de création d'element?

Code :
1
2
3
4
5
$titre_identite	  = new eltTitre('TITRE_IDENTITE',"Fonction des collaborateurs ");
 
        $id_fonction	= new eltIdentifiantDisabled('ID_FONCTION');
        $nom			= new eltNom();        
        $description	= new eltDescription('DESCRIPTION');
merci
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 08h40   #14
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Voici un élément simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
class eltNumerique extends Zend_Form_Element_Text
{	
	function __construct($name ="NUMERIQUE", $label="Valeur numérique", $id= "", $class="")
	{
        parent::__construct($name);
 
        $this->setLabel($label)
        	->setRequired(false)
        	->addValidator('Digits', true, array('messages' => 'Le champs doit être composé uniquement de chiffres (sans espace).'))
        	->setAttribs(array("id"=>$id,"class"=>$class));
 
   		$this->addPrefixPath('Formulaires_Decorators', 'formulaires/decorators','decorator');
		$this->setDisableLoadDefaultDecorators(false);
		$this->addDecorator('Composite');
	}
 
    /**
     * Désactive l'élément en positionnant l'attribut html "disabled"
     *
     */
    public function setDisabled()
    {
		$this->setAttrib('disabled','disabled');	    			  	    	
    }
 
    /**
     * Active l'élément en positionnant l'attribut html "enabled"
     *
     */
    public function setEnabled()
    {
		$this->setAttrib('enabled','enabled');	    			
    }
}
?>
Comme tu vois, je vire tous les décorateurs par défaut par $this->setDisableLoadDefaultDecorators(false); et j'y ajoute mon décorateur ici, Composite

A savoir, voici la fonction render de mon élément composite (le code est quasi un copier/coller du code de la documentation en ligne). Dans la variable $output je met le html que je veux avoir. J'ai une charte graphique homogène, du coup, tous mes éléments de tous mes formulaires ont le même design. Ce design est ici basique mais si mon infographiste c'était déchiré un peu plus à me faire un truc plus poussé ou en full css, ça n'aurait rien changé pour moi.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
class Formulaires_Decorators_Composite extends Zend_Form_Decorator_Abstract
{
    public function buildLabel()
    {
        $element = $this->getElement();
        $label = $element->getLabel();
        if ($translator = $element->getTranslator()) {
            $label = $translator->translate($label);
        }
        if ($element->isRequired()) {
            $label .= '*';
        }
        return $element->getView()->formLabel($element->getName(), $label);
    }
 
    public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getValue(),
            $element->getAttribs(),
            $element->options
        );
    }
......
    public function render($content)
    {
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) {
            return $content;
        }
        if (null === $element->getView()) {
            return $content;
        }
 
        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $label     = $this->buildLabel();
        $input     = $this->buildInput();
        $errors    = $this->buildErrors();
        $desc      = $this->buildDescription();
 
        $output = '<tr><td class="titre_rub">'.$label.'</td>'
                . '<td class="input">'.$input
                . $errors. $desc .'</td></tr>';
 
         return $output;
//        switch ($placement) {
//            case (self::PREPEND):
//                return $output . $separator . $content;
//            case (self::APPEND):
//            default:
//                return $content . $separator . $output;
//        }
    }
Mes formulaires sont utilisés pour insérer des informations dans une base de données. Du coup, même si j'ai deux champs dedans, pour moi je passe toujours par des formulaires. Par conséquence, j'utilise une 30taines de formulaires !!! Et un formulaire est au moins associé à une table MySQL et une table est associé à une Zend_Table et un controlleur.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 10h17   #15
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Je te remerci car ce sera utile à garder.
Par contre, j'aurais aimé que plus de discussion existe autour de ce sujet...
Dommage
MERCI ENCORE
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h09.


 
 
 
 
Partenaires

Hébergement Web