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 15/10/2007, 22h28   #1
Membre actif
 
Inscription : 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 : 187
Points : 187
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
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 15h59   #2
Rédacteur
 
Homme Jean-Pierre
Inscription : août 2005
Messages : 333
Détails du profil
Informations personnelles :
Nom : Homme Jean-Pierre
Âge : 26
Localisation : Suisse

Informations forums :
Inscription : août 2005
Messages : 333
Points : 442
Points : 442
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.
__________________
Mes articles DVP : http://jp-grossglauser.developpez.com
Guardian_7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 21h13   #3
Membre actif
 
Inscription : 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 : 187
Points : 187
Merci pour l'info.
Je vais voir ce que je peux faire avec mes dix doigts.
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2007, 12h05   #4
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
non mais c'est facile à faire
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 :
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 :
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 :
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 :
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2007, 12h23   #5
Rédacteur
 
Homme Jean-Pierre
Inscription : août 2005
Messages : 333
Détails du profil
Informations personnelles :
Nom : Homme Jean-Pierre
Âge : 26
Localisation : Suisse

Informations forums :
Inscription : août 2005
Messages : 333
Points : 442
Points : 442
@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 ?
__________________
Mes articles DVP : http://jp-grossglauser.developpez.com
Guardian_7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2007, 13h01   #6
Membre actif
 
Inscription : 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 : 187
Points : 187
J'ai mis en place un truc qui ressemble, et je vais regarder en détail ce que tu as posté, merci beaucoup.
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 13h22   #7
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 23h46   #8
Membre actif
 
Inscription : 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 : 187
Points : 187
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 :
$this->view->pseudo = 'monPseudoAMoi';
et ensuite écrire dans la vue
Code :
<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
sir_gcc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 14h39   #9
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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 :
$this->view->pseudo = 'monPseudoAMoi';
et ensuite écrire dans la vue
Code :
<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 :
$this->view->form = clone($formBean);
et ensuite écrire dans la vue
Code :
<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 :
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 :
<?php $this->displayField('pseudo'); ?>
A+JYT
sekaijin 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 22h33.


 
 
 
 
Partenaires

Hébergement Web