quickstart-create-form.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20879 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.quickstart.create-form">
  5. <title>Tworzenie formularza</title>
  6. <para>
  7. Aby aplikacja książka gości była użyteczna należy umieścić w niej formularz
  8. umożliwiający zapis nowych gości.
  9. </para>
  10. <para>
  11. W pierwszej kolejności należy utworzyć klasę formularza. Można to osiągnąć poprzez
  12. 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 nim następującą
  22. 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 komentarza, pole
  73. <acronym>CAPTCHA</acronym> dla zabezpieczenia przed spamem, guzik wysłania komentarza
  74. oraz żeton bezpieczeństwa (przed <acronym>CSRF</acronym>).
  75. </para>
  76. <para>
  77. Następnie należy zdefiniować nową akcję <methodname>signAction()</methodname> w kontrolerze
  78. <classname>GuestbookController</classname>, która będzie odpowiedzialna za odbiór danych
  79. wysłanych przez formularz. Aby utworzyć nową akcję oraz związany z nią view script
  80. należy uruchomić następujące polecenie:
  81. </para>
  82. <programlisting language="shell"><![CDATA[
  83. % zf create action sign Guestbook
  84. Creating an action named sign inside controller
  85. at application/controllers/GuestbookController.php
  86. Updating project profile '.zfproject.xml'
  87. Creating a view script for the sign action method
  88. at application/views/scripts/guestbook/sign.phtml
  89. Updating project profile '.zfproject.xml'
  90. ]]></programlisting>
  91. <para>
  92. Jak widać z komunikatów, polecenie tworzy metodę <methodname>signAction()</methodname>
  93. w kontrolerze oraz odpowiedni widok.
  94. </para>
  95. <para>
  96. Teraz należy zapisać logikę aplikacji w treści nowej akcji. Na początek należy sprawdzić
  97. czy żądanie zostało otrzymane metodą <acronym>POST</acronym> czy <acronym>GET</acronym>.
  98. W przypadku metody <acronym>GET</acronym> zostanie po prostu pokazany formularz do
  99. wypełnienia. Jednak dla metody <acronym>POST</acronym> niezbędne będzie sprawdzenie
  100. poprawności przesyłanych danych oraz, w przypadku pozytywnej weryfikacji, utworzenie
  101. nowego rekordu i zapisanie go w bazie danych. Logika może wyglądać następująco:
  102. </para>
  103. <programlisting language="php"><![CDATA[
  104. // application/controllers/GuestbookController.php
  105. class GuestbookController extends Zend_Controller_Action
  106. {
  107. // w tym miejscu jest indexAction()...
  108. public function signAction()
  109. {
  110. $request = $this->getRequest();
  111. $form = new Application_Form_Guestbook();
  112. if ($this->getRequest()->isPost()) {
  113. if ($form->isValid($request->getPost())) {
  114. $comment = new Application_Model_Guestbook($form->getValues());
  115. $mapper = new Application_Model_GuestbookMapper();
  116. $mapper->save($comment);
  117. return $this->_helper->redirector('index');
  118. }
  119. }
  120. $this->view->form = $form;
  121. }
  122. }
  123. ]]></programlisting>
  124. <para>
  125. Niezbędna jest również zmiana skryptu widoku
  126. <filename>application/views/scripts/guestbook/sign.phtml</filename>
  127. tak aby zawierał nastęującą treść:
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. <!-- application/views/scripts/guestbook/sign.phtml -->
  131. Please use the form below to sign our guestbook!
  132. <?php
  133. $this->form->setAction($this->url());
  134. echo $this->form;
  135. ]]></programlisting>
  136. <note>
  137. <title>Lepszy wygląd formularzy</title>
  138. <para>
  139. Tak powstały formularz nie stanowi wzoru piękna ale należy pamiętać, iż wygląd
  140. jest w pełni edytowalny. Więcej informacji można zasięgnąć w
  141. <link linkend="zend.form.decorators">rozdziale dotyczącym dekoratorów formularzy</link>.
  142. </para>
  143. <para>
  144. Dodatkowo przydatny może się okazać
  145. <link linkend="learning.form.decorators.intro">tutorial dekoratorów formularzy</link>.
  146. </para>
  147. </note>
  148. <note>
  149. <title>Punkt kontrolny</title>
  150. <para>
  151. Po wejściu pod adres "http://localhost/guestbook/sign" powinien się pokazać formularz
  152. książki adresowej:
  153. </para>
  154. <para>
  155. <inlinegraphic width="421" scale="100" align="center" valign="middle"
  156. fileref="figures/learning.quickstart.create-form.png" format="PNG" />
  157. </para>
  158. </note>
  159. </sect1>