1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21814 -->
4 <sect1 id="learning.quickstart.create-form">
5 <title>Tworzenie formularza</title>
8 Aby aplikacja księgi gości była użyteczna należy umieścić w niej formularz
9 umożliwiający dodawanie nowych wpisów.
13 W pierwszej kolejności należy utworzyć klasę formularza. Można to osiągnąć
17 <programlisting language="shell"><![CDATA[
18 % zf create form Guestbook
19 Creating a form at application/forms/Guestbook.php
20 Updating project profile '.zfproject.xml'
24 Powyższe polecenie utworzy katalog <filename>application/forms/</filename>
25 zawierający plik <filename>Guestbook.php</filename>. Należy umieścić w
26 nim następującą treść:
29 <programlisting language="php"><![CDATA[
30 // application/forms/Guestbook.php
32 class Application_Form_Guestbook extends Zend_Form
34 public function init()
36 // Ustawienie metody wysyłki danych formularza na POST
37 $this->setMethod('post');
39 // Dodanie elementu do wpisania adresu e-mail
40 $this->addElement('text', 'email', array(
41 'label' => 'Your email address:',
43 'filters' => array('StringTrim'),
44 'validators' => array(
49 // Dodanie elementu do dodania komentarza
50 $this->addElement('textarea', 'comment', array(
51 'label' => 'Please Comment:',
53 'validators' => array(
54 array('validator' => 'StringLength', 'options' => array(0, 20))
58 // Dodanie elementu captcha
59 $this->addElement('captcha', 'captcha', array(
60 'label' => 'Please enter the 5 letters displayed below:',
63 'captcha' => 'Figlet',
69 // Dodanie guzika do wysyłki
70 $this->addElement('submit', 'submit', array(
72 'label' => 'Sign Guestbook',
75 // Dodanie zabezpieczenia przed CSRF
76 $this->addElement('hash', 'csrf', array(
84 Powyższy formularz definiuje pięć elementów: pole adresu e-mail, pole
85 komentarza, pole <acronym>CAPTCHA</acronym> dla zabezpieczenia przed spamem,
86 przycisk wysłania komentarza oraz żeton bezpieczeństwa (przed <acronym>CSRF</acronym>).
90 Następnie należy zdefiniować nową akcję <methodname>signAction()</methodname>
91 w kontrolerze <classname>GuestbookController</classname>, która będzie
92 odpowiedzialna za odbiór danych wysłanych przez formularz. Aby utworzyć
93 nową akcję oraz związany z nią skrypt widoku należy uruchomić następujące
97 <programlisting language="shell"><![CDATA[
98 % zf create action sign Guestbook
99 Creating an action named sign inside controller
100 at application/controllers/GuestbookController.php
101 Updating project profile '.zfproject.xml'
102 Creating a view script for the sign action method
103 at application/views/scripts/guestbook/sign.phtml
104 Updating project profile '.zfproject.xml'
108 Jak widać z komunikatów, polecenie tworzy metodę <methodname>signAction()</methodname>
109 w kontrolerze oraz odpowiedni widok.
113 Teraz należy zapisać logikę aplikacji w treści nowej akcji. Na początek należy sprawdzić
114 czy żądanie zostało otrzymane metodą <acronym>POST</acronym> czy <acronym>GET</acronym>.
115 W drugim przypadku zostanie po prostu pokazany formularz do
116 wypełnienia. Jednak dla metody <acronym>POST</acronym> niezbędne będzie sprawdzenie
117 poprawności przesyłanych danych oraz w przypadku pozytywnej weryfikacji, utworzenie
118 nowego rekordu i zapisanie go w bazie danych. Logika może wyglądać następująco:
121 <programlisting language="php"><![CDATA[
122 // application/controllers/GuestbookController.php
124 class GuestbookController extends Zend_Controller_Action
126 // w tym miejscu jest indexAction()...
128 public function signAction()
130 $request = $this->getRequest();
131 $form = new Application_Form_Guestbook();
133 if ($this->getRequest()->isPost()) {
134 if ($form->isValid($request->getPost())) {
135 $comment = new Application_Model_Guestbook($form->getValues());
136 $mapper = new Application_Model_GuestbookMapper();
137 $mapper->save($comment);
138 return $this->_helper->redirector('index');
142 $this->view->form = $form;
148 Niezbędna jest również zmiana skryptu widoku
149 <filename>application/views/scripts/guestbook/sign.phtml</filename>
150 tak aby zawierał następującą treść:
153 <programlisting language="php"><![CDATA[
154 <!-- application/views/scripts/guestbook/sign.phtml -->
156 Please use the form below to sign our guestbook!
159 $this->form->setAction($this->url());
164 <title>Lepszy wygląd formularzy</title>
167 Tak powstały formularz nie stanowi wzoru piękna, ale należy pamiętać, iż wygląd
168 jest w pełni edytowalny. Więcej informacji można zasięgnąć w
169 <link linkend="zend.form.decorators">rozdziale dotyczącym dekoratorów formularzy</link>.
173 Dodatkowo przydatny może się okazać
174 <link linkend="learning.form.decorators.intro">samouczek tworzenia
175 dekoratorów formularzy</link>.
180 <title>Punkt kontrolny</title>
183 Po wejściu pod adres "http://localhost/guestbook/sign" powinien się
184 pokazać formularz księgi gości:
188 <inlinegraphic width="421" scale="100" align="center" valign="middle"
189 fileref="figures/learning.quickstart.create-form.png" format="PNG" />