7.PHP pour le web

7.3.Validation de formulaire

7.3.4.Validation de formulaire avec Zend Framework

7.3.4.1.Introduction

Afin d'éviter de réécrire à chaque développement les fonctions de validation d'un formulaire vous pouvez vous appuyer sur Zend framework.

7.3.4.2.Installation

Pour utiliser Zend framework en tant que simple bibliothèque de fonctions (comme ici, et par opposition à l'aspect framework) il suffit de le télécharger et inclure le contenu du dossier library/ dans le include_path.

7.3.4.3.Formulaire

7.3.4.3.1.La classe du formulaire

Cette fois-ci nous allons créer un formulaire en nous appuyant sur une nouvelle classe du framework Zend_Form.
<?php
class MonformForm extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        $this->addElement('text', 'nom',
                          array('label' => 'Nom:',
                                'required' => true)
                         );
        $this->addElement('submit', 'submit', array('label' => 'Enregistrer'));
    }
}
Vous pouvez copier ce fichier un peu où bon vous semble mais le copier dans un repertoire forms/ sous app/ est sans doute le plus judicieux (c'est ce que nous avons retenu en tout cas).
Le contenu de ce fichier est assez simple à comprendre. Nous créons une instance de formulaire, s'appuyant sur la méthode POST, incluant un champ de type texte, avec pour identifiant "nom", pour label "Nom:" et il s'agit d'un champ obligatoire. Ce formulaire est en outre muni d'un bouton submit avec un label "Enregistrer".

7.3.4.3.2.Le controleur du formulaire

Comme nous l'avons vu précédemment, par défaut, à tout controleur est associé une vue. Et il se trouve que l'objet représentant cette vue est disponible au sein de l'objet controleur via la variable $this->view. Nous pouvons alors associer une instance du formulaire (précédent) à cette vue. C'est ce que fait le code suivant:
<?php
require_once(dirname(__FILE__)."/../forms/MonformForm.php");

class MonformController extends Zend_Controller_Action
{
    public function indexAction()
    {
         $this->view->form = new MonformForm();
    }
}

7.3.4.3.3.La vue du formulaire

Reste à créer la vue (ou son template). A copier évidemment sous /apps/views/scripts/monform/.
Mon 1er formulaire Zend
<?php echo $this->form ?>

7.3.4.3.4.Test

Maintenant, il suffit d'appeler l'URL http://localhost/monform pour observer le résultat. Le formulaire s'affiche sans même avoir à écrire le moindre bout de code HTML. Voilà, ce dont j'ai toujours rêvé.
Certes la présentation est sommaire mais peut-être suffisante pour faire une maquette du projet à venir, que l'on n'aura même pas besoin de jeter, sachant qu'il sera par la suite possible de personnaliser le rendu pour le rendre plus... sexy.
Cependant, dans l'immédiat, il y a plus important, puisque la validation du formulaire n'est pas effective (que l'on saisisse ou non un nom, le résultat est le même alors qu'il s'agit d'un champ obligatoire).

7.3.4.4.Validation du formulaire

Pour valider les données du formulaire, nous devons compléter l'implémentation du controleur en nous appuyant sur les méthodes de la classe Zend_Form (dont hérite notre formulaire).
<?php
require_once(dirname(__FILE__)."/../forms/MonformForm.php");

class MonformController extends Zend_Controller_Action
{
    public function indexAction()
    {
         $form = new MonformForm();

         // Si le formulaire vient d'être "soumis"
         // nous aurons besoins des données suivantes
         $request = $this->getRequest();

         // Justement... voyons si le formulaire vient d'être "posté"
         if ($request->isPost()) {
             // Oui... alors validons les données saisies.
             if ($form->isValid($request->getPost())) {
                // Tout est valide... 
                // Nous pouvons sauver les données (non implémenté ici)
                // Puis passer à la vue "sauve"
                return $this->_helper->redirector('sauve');
             }
         }
 
         $this->view->form = $form;
    }

    public function sauveAction()
    {
    }
}
Tout d'abord il convient de récupérer les données de la requête afin de vérifier si un formulaire a été soumis (via la méthode POST). Si tel est le cas, il est alors facile de valider les données (ici, s'assurer que le champ obligatoire nom est saisie) simplement en appelant la méthode isValid() de l'objet formulaire avec pour paramètre ceux de la requête (récupérés via $this->getRequest()->getPost()). A ce niveau il y a 2 cas de figures possibles:
  • La validation est un succés, nous pouvons alors sauvegarder (ce qui n'est pas fait ici) et nous rediriger vers une nouvelle action/vue
  • La validation échoue, et alors de façon transparente une liste de messages d'erreur associés à la validation des différents champs est construite et sera automatiquement affichée (en utilisant exactement le même template de vue que précédemment)
Testez à nouveau en tapant dans votre navigateur http://localhost/monform. Cliquez sur "enregistrer" sans saisir de nom et par magie (ou presque) le formulaire s'affiche à nouveau en précisant les erreurs de validation.
Si par contre, vous saisissez un nom que se passe-t-il? Oui... une exception est levée mais vous devriez comprendre pourquoi. Simple, c'est l'action sauve qui est appelée. Et même si la méthode correspondante existe (et ne fait rien) elle est associée à une vue qui n'existe pas. Vous pouvez la créer en ajoutant le code suivant (sous app/views/scripts/monform/sauve.phtml comme vous le savez maintenant).
Votre nom a été enregistré (ou pas)