
Zend Framework possède son propre outil pour gérer les formulaires correctement : Zend_Form est là pour ça !
Il s’agit d’une librairie qui gère vos composants de formulaires (y compris leur rendu), les validations, le filtrage des données, et la gestion de sous-formulaires.
La librairie Zend_Validate qui gère les validateurs sera aussi utiliser dans ce tutoriel afin d’illustrer les validations de formulaire et ce de façon personnalisé.
Tout d’abord nous allons voir les principes basiques des formulaires avec Zend Framework : il nous faudra ajouter un dossier « forms » dans notre répertoire « application ».

Voici un premier example de la création d’un formulaire dans notre fichier « Author.php ». Il s’agit d’une classe qui correspondra à un formulaire d’inscription d’un auteur :
class Form_Author extends Zend_Form
{
/**
* Surcharge du constructeur du formulaire
*/
public function __construct($options = null)
{
parent::__construct($options = null)
$this->setName('subscription'); // On nomme le formulaire
$id = new Zend_Form_Element_Hidden('id'); // On rajoute un champs caché
$email = new Zend_Form_Element_Text('email');
$email->setRequired(true)
->setLabel('Veuillez saisir votre e-mail');
// Nous avons rajouter un attribut obligatoire à notre email et nous lui avons donné un libellé avant le champs texte
// Ensuite on peut insérer les composants (elements) dans le formulaire
$this->addElements($id, $email);
}
}
Nous avons réaliser une ébauche de formulaire, pour l’utiliser dans notre contrôleur et vue, rien de plus simple
AuthorController.php
function suscribeAction ()
{
$form = new Form_Author(); // On instancie le formulaire
$this->view->form = $form // On le renvoie à la vue
}
// Pour l'éditer il faut renvoyer les informations au formulaire
function editsubscriptionAction()
{
$form = new Form_Author();
$model = new Model_DbTable_Author();
$data = $model->getAuthor('5'); // On récupère toutes les données d'un auteur dans la base de données
$form->populate ($data); // On propulse les données dans le formulaire
$this->view->form = $form;
}
Ensuite dans la vue, on affiche le formulaire et on définit son action :
Author.phtml
echo $this->form; $this->form>setAction(author/save); // On définit l'action qui récupère le formulaire
Voici un exemple beaucoup plus complet d’un formulaire avec des validateurs, internationalisation et un captcha :
<?php
class Form_Author extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('Subscription');
$id = new Zend_Form_Element_Hidden('id');
$translate = Zend_Registry::get('translate');
$emptyValidator = new Zend_Validate_NotEmpty();
$emptyValidator->setMessage($translate->_("Ce champs est vide : vous devez le compléter"));
$emailValidator = new Zend_Validate_EmailAddress();
$emailValidator->setMessage($translate->_('L'adresse email n'est pas valide'));
$primaryValidator = new Zend_Validate_Db_NoRecordExists('users', 'username');
$primaryValidator->setMessage($translate->_("L'adresse email a déjà été utilisée"), Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND);
$stringLengthValdiator = new Zend_Validate_StringLength(6, 12);
$stringLengthValdiator->setMessage($translate->_('La longueur du mot de pase doit être comprise entre 6 et 12 caractères'));
$email = new Zend_Form_Element_Text('email');
$email->setLabel($translate->_('Email'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emailValidator)
->addValidator($primaryValidator)
->addValidator($emptyValidator);
$password = new Zend_Form_Element_Password('password');
$password->setLabel($translate->_('mot de passe'));
$password->addValidator($stringLengthValdiator);
$password->addValidator($emptyValidator);
$password_verification = new Zend_Form_Element_Password ('password_confirm');
$password_verification->setLabel ($translate->_('retapez le mot de passe pour vérification'));
$password_verification->addValidator($emptyValidator);
if (isset($_POST['password'])) {
$passwordVerificationValidator = new Zend_Validate_Identical($_POST['password']);
$passwordVerificationValidator->setMessage($translate->_('Les mots de passe ne correspondent pas'));
$password_verification->addValidator($passwordVerificationValidator);
}
$sex = new Zend_Form_Element_Radio('sex', array('separator' => ' '));
$sex->setMultiOptions (array('male' => 'Homme', 'female' => 'Femme '))
->setLabel($translate->_('Sexe'))
-> isRequired(true);
$name = new Zend_Form_Element_Text('name');
$name->setLabel($translate->_('Prénom'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
$surname = new Zend_Form_Element_Text('surname');
$surname->setLabel($translate->_('Nom'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
$address = new Zend_Form_Element_Text('address_author');
$address->setLabel($translate->_('Adresse'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
$zip_code = new Zend_Form_Element_Text('zip_code_author');
$zip_code->setLabel($translate->_('Code Postal'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
$city = new Zend_Form_Element_Text('city_author');
$city->setLabel($translate->_('Ville'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
$phone = new Zend_Form_Element_Text('phone');
$phone->setLabel($translate->_('Téléphone'))
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($emptyValidator);
}
$submit = new Zend_Form_Element_Submit('valid');
$submit->setAttrib('id', 'submitbutton')
->setLabel($translate->_('Enregistrer l'annonce'));
$this->addElements(array($id, $email,$password, $password_verification, $sex, $name, $surname, $address, $zip_code, $city, $phone, $submit));
}
}
?>
Dans le prochaine tutorial, nous verrons comment mettre en application tout ce que nous avons vu précédemment dans un « CRUD » (Create Read Update Delete) qui illustrera l’utilisateur du design-pattern MVC, Zend_Db, Zend_Form, Zend_Validate et Zend_Layout.







Maxence
Tu devrais utiliser la méthode init pour initialiser ton formulaire au lieu de surcharger le constructeur.
Alexandre JULIEN
En effet, j’aurais du en parler à la fin. J’ai encore quelques habitudes de Symfony qui sont restés donc pour les débutants, il est préférable d’utiliser la méthode init() au lieu de surcharger le constructeur. Cela évite notamment le « parent::__construct($options); ».
Cela permet au moins d’illustrer comment ce construit un objet Zend_Form.
baikhar
merçi bien pour l’explication
mais j’arrive pas a comprendre comment on as réalisé la connexion a la base de données
svp si tu peu explique la connexion et en quelle fichier exactement
merçi
admin
Bonjour cette partie ne détaille que la création d’un formulaire et la mise en place de validateur, il ne traite pas de la partie enregistrement en base de données.
Pour cela tu peux voir comment on interagie avec une base de données dans la partie #3 sur la couche modèle.
Pour sauvegarder le contenu du formulaire il suffit de créer une méthode dans la classe Db_Table_Author par exemple et de créer une requête pour insérer ou mettre à jour grâce aux valeurs de ton formulaire.
nico
Merci beaucoup c’est clair et précis. Je comprend mieux l’interaction entre le contrôleur et la vue.