Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-10-2007 12:10:08

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Classe utilitaire pour les formulaires

suite à la question de sir_gcc sur developpez.com je vous reporte ici ma reponse

sir_gcc;2585284 a écrit:

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

Dans le formulaire mettre les champs sous la forme

Code:

 <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:

$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:

   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:

<?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:

      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:

$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

Dernière modification par sekaijin (18-10-2007 12:12:20)

Hors ligne

 

#2 08-11-2007 10:48:18

allfab
Membre
Date d'inscription: 02-10-2007
Messages: 40

Re: Classe utilitaire pour les formulaires

Bonjour,

Je viens d'utiliser cette classe pour la validation de mon formulaire mais il me reste encore un soucis à régler !!

Dans mon controller UserController.php, j'ai une action "add" qui me permet d'ajouter un utilisateur à mon appli. Dans cette action, je récupère les données de mon formulaire, je les filtres, si $validate->isValid(); est à True alors j'insère dans ma table - sinon je récupère les erreurs ($validate->getMessages(); / $validate->getErrors()wink.

Le problème survient ici ! Mon action récupère bien ces erreurs mais je n'arrive pas à les injecter dans ma vue.
getMessages() et getErrors() renvoie des tableaux. Je décide de récupérer getMessages() à insérer dans ma vue :

UserController.php

Code:

   
   //Retourne la liste des messages d'erreurs
   $getMessages = $validate->getMessages();
   $this->view->assign($getMessages);

Pour info, on a un tableau comme celui ci :
  [0] => string(29) "L'identifiant est obligatoire"
  [1] => string(31) "Le mot de passe est obligatoire"
  [2] => string(22) "Le nom est obligatoire"
  [3] => string(25) "Le prenom est obligatoire"
  [4] => string(23) "Le mail est obligatoire"
  [5] => string(30) "Le format du mail est invalide"

add.tpl.php

Code:

Etant donné le format du tableau, il faudrait que j'échappe un truc dans ce style :

   echo  $this->escape($this->0);

Mais le framework n'aime pas du tout....

Sinon j'ai essayé de récupérer le get Errors() de cette manière :
UserController.php

Code:

   
      //Retourne un objet ayant les mêmes membres que le form qui ont pour valeur un tab de message d'erreur
      $validate->getErrors();
      $getErrors = $validate->getErrors(); 
      $this->view->assign((array)$getErrors);

Pour info, on a un tableau comme celui ci :
$validate->getErrors() object(stdClass)#76 (4) {
  ["user_username"] => array(1) {
    [0] => string(29) "L'identifiant est obligatoire"
  }
  ["user_name"] => array(1) {
    [0] => string(22) "Le nom est obligatoire"
  }
  ["user_firstname"] => array(1) {
    [0] => string(25) "Le prenom est obligatoire"
  }
  ["user_email"] => array(2) {
    [0] => string(23) "Le mail est obligatoire"
    [1] => string(30) "Le format du mail est invalide"
  }
}

add.tpl.php

Code:

Etant donné le format du tableau, j'échappe comme ceci :

   echo $this->escape($this->user_password[0]);
Là, ça marche bien, mais comment récupérer toutes mes erreurs ?

Voilà je bloque là, je n'arrive pas à afficher ce tableau dans ma vue add.tpl.php

Si quelqu'un a un idée ?!

Merci

Dernière modification par allfab (08-11-2007 12:24:18)

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