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 Framework PHP Discussion :

Bonne pratique Zend_Form


Sujet :

Zend Framework PHP

  1. #1
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Par défaut Bonne pratique Zend_Form
    Bonjour tout le monde,

    je suis en train d'apprendre à utiliser le Zend_Framework en ce moment.

    Je me base sur :
    - Livre Zend Framework (Cahier du programmeur) de Julien Pauli et Guillaume Ponçon
    - Tuto : Débuter avec Zend Framework
    - Tuto : Présentation du Zend_Framework
    - Doc officielle

    Dans le topic débat sur les bonnes pratiques, on évoque le sujet, mais il n'y a pas de réponse ferme.

    Je constate qu'il y a différentes manières d'utiliser le composant Zend_Form :

    1. Génération du formulaire dans l'action du controleur
    2. Génération du formulaire dans une classe spécifique, l'action instancie cette classe
    3. Utiliser un fichier ini (comme par exemple ici, à la fin du tuto)


    L'approche par fichier ini me semble la plus pratique. Mais à long terme, j'ai peur qu'elle manque de souplesse (traduction, données dynamiques...)

    Donc :
    - me conseillez-vous l'approche par fichier ini ? Si non, pourquoi ?
    - quelle approche vous semble à long terme la plus adaptée (pour des projets moyens et gros) ?

    Merci de votre aide

    Edit: la question a déjà été posée sur le forum (exemple), mais à ma connaissance il n'y a pas eu de vraie analyse sur le sujet...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut Génération du formulaire dans une classe spécifique
    Bonjour,

    En prenant compte ma modeste expérience en ZF, je recommande les développeurs à utiliser des classe héritent depuis la classe Zend_Form.

    Parce que:
    - C'est plus flexible, au cas où je veux ajouter des fonctions propres à moi dans ma classe fils de Zend_Form.
    - Ça me permet de spécifier un fichier .phtml (script XHTML) comme décorateur de mon formulaire au lien de se casser la tête avec les décorateurs des inputs propre a Zend.

    Voila!

    Cordialement.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    278
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 278
    Par défaut
    +1 pour abenlahsen

  4. #4
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Par défaut
    Citation Envoyé par abenlahsen Voir le message
    - Ça me permet de spécifier un fichier .phtml (script XHTML) comme décorateur de mon formulaire au lien de se casser la tête avec les décorateurs des inputs propre a Zend
    Et du coup tu t'organise comment ? Tu as fait un dossier "forms" dans les "views" pour gérer ça plus simplement ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut Mettre un décorateur XHTML propre
    Bonjour,

    Oui exactement
    Je m'explique ça peut-être intéressant pour les autres

    Je vous montre un exemple dont je travail actuellement (Search Lucene).

    - Structure du projet (cf. PJ structure projet.jpg).

    - Classe du formulaire :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    <?php
    /**
     * Class Views_Forms_AddForm
     * 
     * Classe du formulaire Ajouter une entée dans la base de Lucene
     * 
     * @author Ahmed Benlahsen <abenlahsen@gmail.com>
     * @access public
     */
    class Views_Forms_AddForm extends Zend_Form {
        /**
         * Nom du formalaire
         * @var <string>
         */
        private $_formName;
     
        /**
         * Action du formulaire
         * @var <string>
         */
        private $_action;
     
        /**
         * La clé de l'entrée dans Lucence
         * @var <Zend_Form_Element_Text>
         */
        private $_keywordValue;
     
        /**
         * Nom associé à la clé
         * @var <Zend_Form_Element_Text>
         */
        private $_nomValue;
     
        /**
         * Prenom associé à la clé
         * @var <Zend_Form_Element_Text>
         */
        private $_prenomValue;
     
        /**
         * Bouton submit
         * @var <Zend_Form_Element_Submit>
         */
        private $_submit;
     
        /**
         * Bouton reset
         * @var <Zend_Form_Element_Reset>
         */
        private $_reset;
     
        /**
         * Logger du projet
         * @var <Zend_Log>
         */
        private $_logger;
     
        public function  __construct(array $options) {
            // Get looger object from registry
            $this->_logger = Zend_Registry::get('logger');
     
            // Check if params exists if not set default values
            if( isset($options['name']) ){
                $this->_formName = $options['name'];
            } else {
                $this->_formName = 'form';
            }
     
            if( isset($options['action']) ){
                $this->_action = $options['action'];
            } else {
                $this->_action = '';
            }
     
            // Create elements objects
            try{
                $this->_keywordValue = new Zend_Form_Element_Text($options['keyValue']);
                $this->_keywordValue->setLabel('Keywork :');
            } catch (Zend_Form_Element_Exception $e){
                $this->_logger->log($e->getMessage(), Zend_Log::ERR);
            }
     
            try{
                $this->_nomValue = new Zend_Form_Element_Text($options['nomValue']);
                $this->_nomValue->setLabel('Nom :');
            } catch (Zend_Form_Element_Exception $e){
                $this->_logger->log($e->getMessage(), Zend_Log::ERR);
            }
     
            try{
                $this->_prenomValue = new Zend_Form_Element_Text($options['prenomValue']);
                $this->_prenomValue->setLabel('Prenom :');
            } catch (Zend_Form_Element_Exception $e){
                $this->_logger->log($e->getMessage(), Zend_Log::ERR);
            }
     
            try{
                $this->_submit = new Zend_Form_Element_Submit('submit');
                $this->_reset = new Zend_Form_Element_Reset('reset');
            } catch (Zend_Form_Element_Exception $e){
                $this->_logger->log($e->getMessage(), Zend_Log::ERR);
            }
     
            // Init form
            $this->init();
     
            // Call parent construct
            parent::__construct($options);
        }
     
        /**
         * Function init
         *
         * Initialiser le formulaire:
         *  - Affecter le nom
         *  - Affecter le prenom
         *  - Affecter la method
         *  - Affecter le décorateur
         *  - Ajouter les elements au formulaire
         *
         * @author Ahmed Benlahsen <abenlahsen@gmail.com>
         * @access public
         */
        public function init(){
     
            $this->setName($this->_formName);
            $this->setAction($this->_action);
            $this->setMethod('post');
     
            $this->setDecorators(array(
                array('ViewScript', array('viewScript' => 'forms/addform.phtml'))
            ));
     
            $this->addElements(array(
                $this->_keywordValue,
                $this->_nomValue,
                $this->_prenomValue,
                $this->_submit,
                $this->_reset
            ));
        }
    }
    ?>
    - Fichier addform.phtml :
    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
    <form name="<?php echo $this->element->getName(); ?>" id="<?php echo $this->element->getId(); ?>" action="<?php echo $this->element->getAction(); ?>" method="<?php echo $this->element->getMethod(); ?>">
        <table>
            <tr>
                <td><?php echo $this->element->keywordValue->renderLabel(); ?></td>
                <td>
                    <?php echo $this->element->keywordValue->renderViewHelper(); ?>
                    <?php echo $this->element->keywordValue->renderErrors() ?>
                </td>
            </tr>
            <tr>
                <td><?php echo $this->element->nomValue->renderLabel(); ?></td>
                <td>
                    <?php echo $this->element->nomValue->renderViewHelper(); ?>
                    <?php echo $this->element->nomValue->renderErrors() ?>
                </td>
            </tr>
            <tr>
                <td><?php echo $this->element->prenomValue->renderLabel(); ?></td>
                <td>
                    <?php echo $this->element->prenomValue->renderViewHelper(); ?>
                    <?php echo $this->element->prenomValue->renderErrors() ?>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <?php echo $this->element->submit->renderViewHelper(); ?>
                    <?php echo $this->element->reset->renderViewHelper(); ?>
                </td>
            </tr>
        </table>
    </form>
    - L'appel dans le controller :
    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
    public function addAction(){
     
            // If I don't use the AutoLoader of Zend we do this
            Zend_Loader::loadClass('Views_Forms_AddForm', APPLICATION_PATH);
     
    		// Set params of my form
            $options = array(
                    'name' => 'luceneAddForm',
                    'action' => $this->view->url(),
                    //'keyLabel' => 'keywordName',
                    'keyValue' => 'keywordValue',
                    //'nomLabel' => 'nomName',
                    'nomValue' => 'nomValue',
                    //'prenomLabel' => 'prenomLabel',
                    'prenomValue' => 'prenomValue'
                );
     
    		// Instanciate my Form
            $form = new Views_Forms_AddForm($options);
     
            if( $this->getRequest()->isPost() ){// If form submited
    			// Get all form's values
                $data = $this->getRequest()->getParams();
     
                if( $form->isValid($data) ){// If is valid data
                    // My code here
                } else {// If not => render form + Errors
     
                    $form->populate($data);
                }
            } else {// If not => set form to view
                $this->view->form = $form;
            }
        }
    Enjoy!

    Cordialement.
    Images attachées Images attachées  

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Je pense aussi qu'il faut un peu se "décomplexer" vis à vis des bonnes pratiques : si il y en a qui sont très difficilement contournable, bien souvent la bonne pratique c'est celle qui correspond le mieux au besoin du moment.

    Comme visiblement un peu tout le monde ici je préfère de loin hériter depuis la classe Zend_Form. En plus de la flexibilité déjà citée maintes et maintes fois, j'irais jusqu'à dire que ça permet de structurer son projet de façon plus claire et que les formulaires sous forme de classe sont plus lisibles que sous forme de fichier de configuration...

    Dans mon utilisation de tous les jours, je me vois mal utiliser les fichiers de configuration autrement que pour afficher des formulaires générés dynamiquement.

    Merci abenlahsen pour la structure d'exemple, c'est toujours bon à prendre si jamais les décorateurs s'avèrent trop limités / complexes à mettre en oeuvre Mais jusqu'ici j'ai toujours réussi à faire avec sans trop perdre de cheveux.

  7. #7
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Par défaut
    abenlahsen > Est-ce que le try catch sur chaque ajout d'élement est vraiment utile ? Il est fréquent que cette action lève une exception ?

    Merci pour ta structure

    Je pense aussi qu'il faut un peu se "décomplexer" vis à vis des bonnes pratiques : si il y en a qui sont très difficilement contournable, bien souvent la bonne pratique c'est celle qui correspond le mieux au besoin du moment.
    Il y a "bonne pratique théorique" et "bonne pratique au cas par cas". A mon avis la seconde doit toujours dérivée de la première. Quand on travaille en équipe sur de très gros projets, si une seule personne ne respecte pas une pratique ou une convention c'est toute l'équipe qui en pâtit à mon avis...

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut
    Bonjour Halleck,

    Non c'est pas obligatoire du tout ! Tu as le choix de le laisser ou l'enlever

    Cordialement,
    Ahmed.

  9. #9
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Citation Envoyé par Halleck Voir le message
    Il y a "bonne pratique théorique" et "bonne pratique au cas par cas". A mon avis la seconde doit toujours dérivée de la première. Quand on travaille en équipe sur de très gros projets, si une seule personne ne respecte pas une pratique ou une convention c'est toute l'équipe qui en pâtit à mon avis...
    Évidement, il ne faut pas trop se décomplexer non plus

    Il faut respecter les conventions fixées en interne c'est une évidence, mais je ne pense pas que ce soit très constructif que de fixer comme norme de codage des règles du genre "un formulaire doit être configuré uniquement de telle manière", car il arrive tôt ou tard que ça ne corresponde pas au besoin du moment.

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    278
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 278
    Par défaut
    Le problème étant qu'il existe au moins 10 façon de faire un formulaire et je trouve qu'au final bcp s'y perdent (dont moi parfois)

Discussions similaires

  1. Bonnes pratiques de protections individuelles
    Par Community Management dans le forum Sécurité
    Réponses: 23
    Dernier message: 11/06/2024, 11h23
  2. [Zend_Form] Bonne pratique avec validateurs spécifiques
    Par jbarthe dans le forum Zend_Form
    Réponses: 4
    Dernier message: 23/12/2008, 17h53
  3. [Bonne pratique]Stratégie d'allocation
    Par jowo dans le forum C
    Réponses: 1
    Dernier message: 05/10/2005, 14h47
  4. [FOREIGN K] Valeur de champ = nom de table. Bonne pratique ?
    Par Seb des Monts dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/05/2005, 10h56

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