<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.quickstart.create-form">
    <title>Erstellen eines Formulars</title>

    <para>
        Damit unser Guestbook nützlich ist, benötigen wir ein Formular für die Übermittlung neuer
        Einträge.
    </para>

    <para>
        Unsere erste Arbeit ist die Erstellung der aktuellen Formularklasse. Um eine leere
        Fomularklasse zu erstellen muss folgendes ausgeführt werden:
    </para>

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

    <para>
        Dies erstellt das Verzeichnis <filename>application/forms/</filename> mit der
        Klassendatei <filename>Guestbook.php</filename>. Diese Datei ist zu öffnen und so zu
        aktualisieren das Sie wie folgt aussieht:
    </para>

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

class Application_Form_Guestbook extends Zend_Form
{
    public function init()
    {
        // Setzt die Methode for das Anzeigen des Formulars mit POST
        $this->setMethod('post');

        // Ein Email Element hinzufügen
        $this->addElement('text', 'email', array(
            'label'      => 'Deine Email Adresse:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'EmailAddress',
            )
        ));

        // Das Kommentar Element hinzufügen
        $this->addElement('textarea', 'comment', array(
            'label'      => 'Bitte ein Kommentar:',
            'required'   => true,
            'validators' => array(
                array('validator' => 'StringLength', 'options' => array(0, 20))
                )
        ));

        // Ein Captcha hinzufügen
        $this->addElement('captcha', 'captcha', array(
            'label'      => "Bitte die 5 Buchstaben eingeben die unterhalb "
                          . "angezeigt werden:",
            'required'   => true,
            'captcha'    => array(
                'captcha' => 'Figlet',
                'wordLen' => 5,
                'timeout' => 300
            )
        ));

        // Den Submit Button hinzufügen
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Im Guestbook eintragen',
        ));

        // Und letztendlich etwas CSRF Protektion hinzufügen
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));
    }
}
]]></programlisting>

    <para>
        Das obige Formular definiert fünf Elemente: ein Feld für die Email Adresse, eines für das
        Kommentar, ein <acronym>CAPTCHA</acronym> um Spam Einträge zu verhindern, einen Submit
        Button und ein <acronym>CSRF</acronym> Protektions Token.
    </para>

    <para>
        Als nächstes fügen wir eine <methodname>signAction()</methodname> zu unserem
        <classname>GuestbookController</classname> welche das Formular nach der Übertragung
        bearbeitet. Um die Action und das betreffende View Skript zu erstellen muss das folgende
        ausgeführt werden:
    </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>
        Das erstellt eine <methodname>signAction()</methodname> Methode in unserem Controller, sowie
        das betreffende View Skript.
    </para>

    <para>
        Fügen wir etwas Logik in unsere Sign Aktion des Guestbook Controller's ein. Wir müssen
        zuerst prüfen ob wir eine <acronym>POST</acronym> oder eine <acronym>GET</acronym> Anfrage
        erhalten; im letzteren Fall zeigen wir das Formular einfach an. Wenn wir aber eine
        <acronym>POST</acronym> Anfrage erhalten, wollten wir die übermittelten Daten gegenüber
        unserem Formular prüfen, und wenn es gültig ist, wird ein neuer Eintrag erstellt und
        gespeichert. Die Logik könnte wie folgt aussehen:
    </para>

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

class GuestbookController extends Zend_Controller_Action
{
    // wir übergehen indexAction()...

    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>
        Natürlich müssen wir das View Skript bearbeiten; es muss
        <filename>application/views/scripts/guestbook/sign.phtml</filename> bearbeitet werden damit
        es wie folgt aussieht:
    </para>

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

Bitte verwende das folgende Formular um sich in unser Guestbook einzutragen!

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

    <note>
        <title>Besser aussehende Formulare</title>

        <para>
            Keiner wird sich irgendwann poetisch über die Schönheit dieses Formulars auslassen.
            Kein Problem - das Aussehen des Formulars kann komplett angepasst werden! Siehe auch im
            <link linkend="zend.form.decorators">Kapitel über Decorations vom Referenz
                Handbuch</link> nach Details.
        </para>

        <para>
            Zusätzlich könnte man an <link
                linkend="learning.form.decorators.intro">unserem Tutorial über Formular
                Decorations</link> interessiert sein.
        </para>
    </note>

    <note>
        <title>Checkpoint</title>

        <para>
            Jetzt gehen wir auf "http://localhost/guestbook/sign". Man sollte das folgende im
            eigenen Browser sehen:
        </para>

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