IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Compréhension et utilisation des Décorateurs


Sujet :

Zend_Form PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    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)

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    J'ai compris ....

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

    merci!!!

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    Merci!!!

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    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.

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    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!!!!!

  8. #8
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    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 Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    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

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    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

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->formulaire = new TicketForm();
    Par exemple, dans l'action modifierAction j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    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!!

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  14. #14
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Voici un élément simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 821
    Points : 280
    Points
    280
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo