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 :

Classe utilitaire pour les formulaires


Sujet :

Zend_Form PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut Classe utilitaire pour les formulaires
    Bonjour,

    je viens du monde Java avec notamment Struts et je me demandais si avec le framework de Zend on a un équivalent des FormBean.
    Les FormBean sont des classes qui "mappent" les formulaires html et qui permettent de récupérer les valeurs entrées dans les différents champs, de les valider selon les critères qu'on veut, et de récupérer les messages d'erreur de validation (pour un affichage ou un traitement).
    Existe-t-il un mécanisme similaire avec ce framework ?
    Ce qui m'interesse le plus est de pouvoir récupérer, dans un objet, les valeurs saisies dans un formulaire.

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Hello,

    Le module Zend_Form est en proposition depuis le mois d'août.

    Il s'agit d'une classe facilitant la création, le traitement et la validation de formulaires (X)HTML.

    Pour l'instant, ça en est toujours aux discussions donc ce ne sera sûrement pas pour la 1.1.0, courant novembre.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    Merci pour l'info.
    Je vais voir ce que je peux faire avec mes dix doigts.

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    non mais c'est facile à faire
    dans le formulaire mettre les champs sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <input type="text" name="form[usr_ident]" size="8" maxlength="8" />
    dans le contrôleur récupérer le formulaire de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->_request->get('form');
    puis pour éviter les intrusion de code il est conseillé de filtrer les valeur par exemple supprimer les espaces avant et après les valeur et supprimer le code html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       protected function _filter($form) {
          $formData = new StdClass();
          Zend_Loader::loadClass('Zend_Filter');
          Zend_Loader::loadClass('Zend_Filter_StripTags');
          Zend_Loader::loadClass('Zend_Filter_StringTrim');
          $filter = new Zend_Filter();
          $filter->addFilter(new Zend_Filter_StripTags());
          $filter->addFilter(new Zend_Filter_StringTrim());
          foreach ($form as $key=>$value) {
             $formData->$key = $filter->filter($value);
          }
          return $formData;
       }
    ensuite passer à la vérification. j'utilise pour ça la classe suivante
    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
    <?php
     
    #Zend_Loader::loadClass('Zend_Validate');
     
    /**
     *
     * Validation de formulaires
     * à adapter pour utiliser pleinnement les Zend_Validate 
     *
     * @author Jean Yves Terrien
     *
     */
    class Fast_Validate #extends Zend_Validate
    {
     
       protected $_verifFormat = array(
          'required'         => '.+',
          'phone'            => '^(\+?[ \t]*[0-9]{2}[ \t]*[0-9]{1}|[ \t]*[0-9]{2})[ \t]*[0-9]{2}[ \t]*[0-9]{2}[ \t]*[0-9]{2}[ \t]*[0-9]{2}$',
          'phoneOrNull'      => '^(\+?[ \t]*[0-9]{2}[ \t]*[0-9]{1}|[ \t]*[0-9]{2})[ \t]*[0-9]{2}[ \t]*[0-9]{2}[ \t]*[0-9]{2}[ \t]*[0-9]{2}$|^$',
          'date'             => '^([0-9]{1,2}).([0-9]{1,2}).([0-9]{2,4})$',
          'dateOrNull'       => '^([0-9]{1,2}).([0-9]{1,2}).([0-9]{2,4})$|^$',
          'identFT'          => '^[a-zA-Z]{4}[0-9]{4}$',
          'identFTOrNull'    => '^[a-zA-Z]{4}[0-9]{4}$|^$',
          'email'            => '^[0-9a-zA-Z_\-]+(\\.)?[0-9a-zA-Z_\-]*@([0-9a-zA-Z_-]+\\.)+[a-zA-Z]{2,4}$',
          'emailOrNull'      => '^[0-9a-zA-Z_\-]+(\\.)?[0-9a-zA-Z_\-]*@([0-9a-zA-Z_-]+\\.)+[a-zA-Z]{2,4}$|^$',
          'hour'             => '^[0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2})?$',
          'codePostal'       => '^[0-9]{5}$',
          'codePostalOrNull' => '^[0-9]{5}$|^$'
       );
     
       /**
        * Array of validation failure messages
        *
        * @var array
        */
       protected $_messages = array();
     
       /**
        * Array of validation failure messages
        *
        * @var array
        */
       protected $_errors = null;
     
       public function __construct($formData, $verif = null)
       {
          $this->formData = $formData;
          if (is_array($verif)) {
             $this->_verifForm($verif);
          }
       }
     
       function _addVerifMessage($key, $msg) {
          if (! isset($this->_errors)) $this->_errors = new StdClass();
          if (! isset($this->_errors->$key)) $this->_errors->$key = array();
          $tab = &$this->_errors->$key;
          $tab[] = $msg;
          $this->_messages[] = $msg;
       }
     
       /**
        * Defined by Zend_Validate_Interface
        *
        * Returns array of validation failure messages
        *
        * @return array
        */
       public function getMessages()
       {
           return $this->_messages;
       }
     
       /**
        * Defined by Zend_Validate_Interface
        *
        * Returns array of validation failure messages
        *
        * @return array
        */
       public function getErrors()
       {
           return $this->_errors;
       }
     
       function _verifForm($verif) {
          $this->_errors = null;
          #Debug::show('$this->formData',$this->formData);
     
          foreach ($verif as $key=>$value) {
             foreach ($value as $ereg=>$msg) {
                #Debug::show($key.'=>'.$this->formData->$key, $this->verifFormat[$ereg].'=>'.ereg($this->verifFormat[$ereg], $this->formData->$key));
                if (!ereg($this->_verifFormat[$ereg], $this->formData->$key)) {
                   $this->_addVerifMessage($key, $msg);
                }
             }
          }
          return $this->isValid();
       }
     
       public function isValid()
       {
          return ($this->_errors == null);
       }
     
    }
    que j'appelle ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          Zend_Loader::loadClass('Fast_Validate');
     
          $verifForm = array(
             'usr_ident'     => array('identFT'     => "L'identifiant FT n'a pas le bon format (Code Aliance)"),
             'usr_pwd'       => array('required'    => "Le mot de passe est obligatoire"),
             'usr_name'      => array('required'    => "Le nom est obligatoire"),
             'usr_firstname' => array('required'    => "Le prénom est obligatoire"),
             'usr_mail'      => array('required'    => "Le mail est obligatoire", 'email' => "Le format du mail est invalide")
          );
          $validate = new Fast_Validate($formData, $verifForm);
    je dispose ensuite des méthodes suivantes pour récupérer les messages et la validité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $validate->isValid(); //true si form valide
    $validate->getMessages(); //retourne la liste des messages d'erreurs
    $validate->getErrors();      //retourne un objet ayant les mêmes membres que le formulaire qui ont pour valeur un tableau de message d'erreur
    A+JYT
    PS : c'est issue d'un dev rodé depuis longtemps et en production dans beaucoup d'applications depuis plusieurs années. je l'ai porté sous ZF mais comme marqué dans le classe à adapter pour utiliser les Zend_Validate qui travail sur un champs et non sur le form en entier mais qui offre beaucoup d'autre vérifications que les expressions régulières

  5. #5
    Invité
    Invité(e)
    Par défaut
    @sekaijin : Ton approche est intéressante, j'ai pas regardé en détail, mais c'est intéressant. Cependant, pourquoi ne pas factoriser tout ça avec Zend_Filter_Input ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    J'ai mis en place un truc qui ressemble, et je vais regarder en détail ce que tu as posté, merci beaucoup.

  7. #7
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    comme je l'ai dit cela est issue d'un dev plus ancien alors que ZF n'était même pas dans la tête de ses concepteurs je l'ai passé sous ZF mais effectivement il faut à terme mieux l'intégrer à ZF

    A+JYT

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    J'ai une petite question à propos des formulaires présents dans les vues:
    comment faire pour gérer le pré-remplissage d'un formulaire.

    Est-ce qu'il y a un autre choix que de mettre des morceaux de script dans la vue. C'est par exemple dans l'action faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->view->pseudo = 'monPseudoAMoi';
    et ensuite écrire dans la vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" value="<?php echo $this->pseudo?>"/>
    Je suis toujours sur mon idée de "cycle" autour d'un formulaire. Le but est d'avoir deux actions: une avant et une après.
    Et l'idéal étant de pouvoir instancier un objet (FormBean) représentant le formulaire dans la première, d'éventuellement fournir des valeurs à cet objet (les attributs qui correspondent aux champs du formulaire), de rendre la vue en utilisant les valeurs passées à l'objet précédemment, et ensuite lors du submit, récupérer les valeurs dans le FormBean pour faire les traitements qu'on veut.
    Cette dernière partie étant en partie résolue

    Vous qui avez l'habitude du développement en PHP, est-ce que c'est la bonne approche pour traiter ce genre de cas, ou bien ma vue des choses est-elle déformée par mon utilisation prolongée de Struts (J2EE) ?

    Merci d'avance à toutes les bonnes âmes qui voudront bien me faire bénéficier de leur expérience.

    PS: je sais: la classe Zend_Form arrive

  9. #9
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Citation Envoyé par sir_gcc Voir le message
    J'ai une petite question à propos des formulaires présents dans les vues:
    comment faire pour gérer le pré-remplissage d'un formulaire.

    Est-ce qu'il y a un autre choix que de mettre des morceaux de script dans la vue. C'est par exemple dans l'action faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->view->pseudo = 'monPseudoAMoi';
    et ensuite écrire dans la vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" value="<?php echo $this->pseudo?>"/>
    Je suis toujours sur mon idée de "cycle" autour d'un formulaire. Le but est d'avoir deux actions: une avant et une après.
    Et l'idéal étant de pouvoir instancier un objet (FormBean) représentant le formulaire dans la première, d'éventuellement fournir des valeurs à cet objet (les attributs qui correspondent aux champs du formulaire), de rendre la vue en utilisant les valeurs passées à l'objet précédemment, et ensuite lors du submit, récupérer les valeurs dans le FormBean pour faire les traitements qu'on veut.
    Cette dernière partie étant en partie résolue

    Vous qui avez l'habitude du développement en PHP, est-ce que c'est la bonne approche pour traiter ce genre de cas, ou bien ma vue des choses est-elle déformée par mon utilisation prolongée de Struts (J2EE) ?

    Merci d'avance à toutes les bonnes âmes qui voudront bien me faire bénéficier de leur expérience.

    PS: je sais: la classe Zend_Form arrive
    déjà côté controller tu peux faire ça ou ton formBean est un objet Bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->view->form = clone($formBean);
    et ensuite écrire dans la vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="form[pseudo]" type="text" value="<?php echo $this->form->pseudo?>"/>
    moi j'utilise comme Bean des StdClass ma partie model me fournis des objet métier qui ont une méthode toStdClass que j'utilise pour la mise en session (du coup pas de pb avec les incomplete object) et aussi pour passer à ma vue.

    concernant la vue tu peux te faire une classe qui dérive de Zend_View que tu vas utiliser comme view.

    ainsi tu peux lui adjoindre des méthodes plus élaborées.
    dans le contrôleur tu donne les données de ton form et sa description
    genre un objet qui décrit pour chaque champs le type les méthodes de vérif etc.
    et dans ta vue tu fait une methode displayField qui génère le input en fonction de la description par exemple
    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
    function displayField($field)
    {
       ?><label for="<?php echo $field; ?>"
       ><?php echo $this->formDesc->$field->label; ?> :</label><?php
       if($this->isEdit) {
          ?><input type="<?php echo $this->formDesc->$field->type; ?>"
          fast:checktype="<?php echo $this->formDesc->$field->checkType; ?>"
          id="<?php echo $field; ?>"
          name="form[<?php echo $field?>]"
          value="<?php echo $this->form->field; ?>"
          size="<?php echo $this->formDesc->$field->size; ?>"><?php
       } else {
          echo $this->form->field;
       }
    }
    ?>
    ainsi dans des phtml tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $this->displayField('pseudo'); ?>
    A+JYT

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

Discussions similaires

  1. crystal report pour les formulaires
    Par guitariste dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/07/2007, 10h28
  2. A propos de TriActif pour les formulaires
    Par Alain6121967 dans le forum IHM
    Réponses: 2
    Dernier message: 07/03/2007, 10h23
  3. Une classe C# pour les matrices
    Par vladvad dans le forum C#
    Réponses: 3
    Dernier message: 02/12/2006, 13h45
  4. [PHP-JS] PHP et JavaScript pour les formulaires
    Par Ylias dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 26/07/2006, 22h47
  5. Norme JavaScript pour les formulaire
    Par rdams dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/09/2005, 14h14

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