# Tworzenie formularza

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

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

    % zf create form Guestbook
    Creating a form at application/forms/Guestbook.php
    Updating project profile '.zfproject.xml'

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

    // 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,
            ));
        }
    }

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

Następnie należy zdefiniować nową akcję `signAction()` w kontrolerze `GuestbookController`, 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:

    % 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'

Jak widać z komunikatów, polecenie tworzy metodę `signAction()` w kontrolerze oraz odpowiedni widok.

Teraz należy zapisać logikę aplikacji w treści nowej akcji. Na początek należy sprawdzić czy żądanie zostało otrzymane metodą POST czy GET. W drugim przypadku zostanie po prostu pokazany formularz do wypełnienia. Jednak dla metody POST 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:

    // 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;
        }
    }

Niezbędna jest również zmiana skryptu widoku `application/views/scripts/guestbook/sign.phtml` tak aby zawierał następującą treść:

    <!-- application/views/scripts/guestbook/sign.phtml -->

    Please use the form below to sign our guestbook!

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

## Lepszy wygląd formularzy

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 rozdziale dotyczącym dekoratorów formularzy.

Dodatkowo przydatny może się okazać samouczek tworzenia dekoratorów formularzy.

## Punkt kontrolny

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