quickstart-create-form.xml 6.5 KB

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