<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: yes -->
<sect1 id="learning.quickstart.create-form">
    <title>Tworzenie formularza</title>

    <para>
        Aby aplikacja księgi gości była użyteczna należy umieścić w niej formularz
        umożliwiający dodawanie nowych wpisów.
    </para>

    <para>
        W pierwszej kolejności należy utworzyć klasę formularza. Można to osiągnąć 
        poprzez polecenie:
    </para>

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

    <para>
        Powyższe polecenie utworzy katalog <filename>application/forms/</filename>
        zawierający plik <filename>Guestbook.php</filename>. Należy umieścić w 
        nim następującą treść:
    </para>

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

class Application_Form_Guestbook extends Zend_Form
{
    public function init()
    {
        // Ustawienie metody wysyłki danych formularza na POST
        $this->setMethod('post');

        // Dodanie elementu do wpisania adresu e-mail
        $this->addElement('text', 'email', array(
            'label'      => 'Your email address:',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'EmailAddress',
            )
        ));

        // Dodanie elementu do dodania komentarza
        $this->addElement('textarea', 'comment', array(
            'label'      => 'Please Comment:',
            'required'   => true,
            'validators' => array(
                array('validator' => 'StringLength', 'options' => array(0, 20))
                )
        ));

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

        // Dodanie guzika do wysyłki
        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Sign Guestbook',
        ));

        // Dodanie zabezpieczenia przed CSRF
        $this->addElement('hash', 'csrf', array(
            'ignore' => true,
        ));
    }
}
]]></programlisting>

    <para>
        Powyższy formularz definiuje pięć elementów: pole adresu e-mail, pole 
        komentarza, pole <acronym>CAPTCHA</acronym> dla zabezpieczenia przed spamem, 
        przycisk wysłania komentarza oraz żeton bezpieczeństwa (przed <acronym>CSRF</acronym>).
    </para>

    <para>
        Następnie należy zdefiniować nową akcję <methodname>signAction()</methodname> 
        w kontrolerze <classname>GuestbookController</classname>, która będzie 
        odpowiedzialna za odbiór danych wysłanych przez formularz. Aby utworzyć 
        nową akcję oraz związany z nią skrypt widoku należy uruchomić następujące 
        polecenie:
    </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>
        Jak widać z komunikatów, polecenie tworzy metodę <methodname>signAction()</methodname>
        w kontrolerze oraz odpowiedni widok.
    </para>

    <para>
        Teraz należy zapisać logikę aplikacji w treści nowej akcji. Na początek należy sprawdzić
        czy żądanie zostało otrzymane metodą <acronym>POST</acronym> czy <acronym>GET</acronym>.
        W drugim przypadku zostanie po prostu pokazany formularz do
        wypełnienia. Jednak dla metody <acronym>POST</acronym> niezbędne będzie sprawdzenie
        poprawności przesyłanych danych oraz w przypadku pozytywnej weryfikacji, utworzenie
        nowego rekordu i zapisanie go w bazie danych. Logika może wyglądać następująco:
    </para>

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

class GuestbookController extends Zend_Controller_Action
{
    // w tym miejscu jest 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>
        Niezbędna jest również zmiana skryptu widoku
        <filename>application/views/scripts/guestbook/sign.phtml</filename>
        tak aby zawierał następującą treść:
    </para>

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

Please use the form below to sign our guestbook!

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

    <note>
        <title>Lepszy wygląd formularzy</title>

        <para>
            Tak powstały formularz nie stanowi wzoru piękna, ale należy pamiętać, iż wygląd
            jest w pełni edytowalny. Więcej informacji można zasięgnąć w
            <link linkend="zend.form.decorators">rozdziale dotyczącym dekoratorów formularzy</link>.
        </para>

        <para>
            Dodatkowo przydatny może się okazać
            <link linkend="learning.form.decorators.intro">samouczek tworzenia 
            dekoratorów formularzy</link>.
        </para>
    </note>

    <note>
        <title>Punkt kontrolny</title>

        <para>
            Po wejściu pod adres "http://localhost/guestbook/sign" powinien się 
            pokazać formularz księgi gości:
        </para>

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