<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.quickstart.create-form">
    <title>Créer un formulaire</title>

    <para>
        Pour que notre livre d'or soit utile, nous allons avoir besoin d'un formulaire permettant de
        le remplir.
    </para>

    <para>
        Nous devons donc créer un formulaire. Pour créer un formulaire vierge, exécutez la
        commande&#160;:
    </para>

    <programlisting language="shell"><![CDATA[
% zf create form Guestbook
Creating a form at application/forms/Guestbook.php
Updating project profile '.zfproject.xml'
]]></programlisting>

    <para>
        Ceci créera le dossier <filename>application/forms/</filename> avec un fichier de classe
        <filename>Guestbook.php</filename>. Ouvrez ce fichier et mettez le à jour comme suit&#160;:
    </para>

    <programlisting language="php"><![CDATA[
// application/forms/Guestbook.php

class Application_Form_Guestbook extends Zend_Form
{
    public function init()
    {
        // La méthode HTTP d'envoi du formulaire
        $this->setMethod('post');

        // Un élément Email
        $this->addElement('text', 'email', array(
            'label'      => 'Your email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'EmailAddress',
            )
        ));

        // Un élément pour le commentaire
        $this->addElement('textarea', 'comment', array(
            'label'      => 'Please Comment:',
            'required'   => true,
            'validators' => array(
                array('validator' => 'StringLength', 'options' => array(0, 20))
                )
        ));

        // Un captcha
        $this->addElement('captcha', 'captcha', array(
            'label'      => 'Please enter the 5 letters displayed below:',
            'required'   => true,
            'captcha'    => array(
                'captcha' => 'Figlet',
                'wordLen' => 5,
                'timeout' => 300
            )
        ));

        // Un bouton d'envoi
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Sign Guestbook',
        ));

        // Et une protection anti CSRF
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));
    }
}
]]></programlisting>

    <para>
        Le formulaire ci-dessus définit cinq éléments&#160;: une adresse email, un champ
        commentaire, un <acronym>CAPTCHA</acronym> anti spam, un bouton d'envoi et une protection
        anti <acronym>CSRF</acronym>.
    </para>

    <para>
        Maintenant nous allons ajouter une action <methodname>signAction()</methodname> à notre
        <classname>GuestbookController</classname> qui va s'occuper de la soumission du formulaire.
        Pour créer cette action et son script de vue, éxécutez&#160;:
    </para>

    <programlisting language="shell"><![CDATA[
% zf create action sign Guestbook
Creating an action named sign inside controller
    at application/controllers/GuestbookController.php
Updating project profile '.zfproject.xml'
Creating a view script for the sign action method
    at application/views/scripts/guestbook/sign.phtml
Updating project profile '.zfproject.xml'
]]></programlisting>

    <para>
        Comme vous le voyez d'après l'affichage, ceci va créer une méthode
        <methodname>signAction()</methodname> dans notre contrôleur, ainsi que le script de vue
        approprié.
    </para>

    <para>
        Ajoutons de la logique dans notre action. Nous devons d'abord vérifier le type de requête
        HTTP <acronym>POST</acronym> ou <acronym>GET</acronym>&#160;; dans ce dernier cas nous
        affichons simplement le formulaire. Cependant, si nous recevons une requête
        <acronym>POST</acronym>, nous allons vouloir valider le formulaire par rapport aux données
        postées, et s'il est valide, créer une nouvelle entrée et la sauvegarder. La logique
        ressemble à ceci&#160;:
    </para>

    <programlisting language="php"><![CDATA[
// application/controllers/GuestbookController.php

class GuestbookController extends Zend_Controller_Action
{
    // indexAction() ici ...

    public function signAction()
    {
        $request = $this->getRequest();
        $form    = new Application_Form_Guestbook();

        if ($this->getRequest()->isPost()) {
            if ($form->isValid($request->getPost())) {
                $comment = new Application_Model_Guestbook($form->getValues());
                $mapper  = new Application_Model_GuestbookMapper();
                $mapper->save($comment);
                return $this->_helper->redirector('index');
            }
        }

        $this->view->form = $form;
    }
}
]]></programlisting>

    <para>
        Bien sur, nous devons aussi éditer le script de vue. Editez
        <filename>application/views/scripts/guestbook/sign.phtml</filename> avec ceci&#160;:
    </para>

    <programlisting language="php"><![CDATA[
<!-- application/views/scripts/guestbook/sign.phtml -->

Utilisez le formulaire ci-après pour signer notre livre d'or!

<?php
$this->form->setAction($this->url());
echo $this->form;
]]></programlisting>

    <note>
        <title>Améliorer le rendu visuel du formulaire</title>

        <para>
            Ce formulaire n'a pas un look terrible, peu importe&#160;: l'apparence d'un formulaire
            est entièrement personnalisable&#160;! Voyez la <link
                linkend="zend.form.decorators">section sur les décorateurs dans le guide de
                réference</link> pour plus de détails.
        </para>

        <para>
            Aussi, vous pouvez être intéréssés par <link
                linkend="learning.form.decorators.intro">notre tutoriel sur les décorateurs de
                formulaires</link>.
        </para>
    </note>

    <note>
        <title>Checkpoint</title>

        <para>
            Naviguez maintenant sur "http://localhost/guestbook/sign". Vous devriez voir ceci dans
            votre navigateur&#160;:
        </para>

        <para>
            <inlinegraphic width="421" scale="100" align="center" valign="middle"
                fileref="figures/learning.quickstart.create-form.png" format="PNG" />
        </para>
    </note>
</sect1>
