Zend Framework tutoriel #4 : Création de formulaire et validations avec Zend_Form et Zend_Validate

Publié le 15 septembre 2009 par Alexandre_julien

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.