| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <?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>
|