2
0

quickstart-create-form.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.quickstart.create-form">
  5. <title>Erstellen eines Formulars</title>
  6. <para>
  7. Damit unser Guestbook nützlich ist, benötigen wir ein Formular für die Übermittlung neuer
  8. Einträge.
  9. </para>
  10. <para>
  11. Unsere erste Arbeit ist die Erstellung der aktuellen Formularklasse. Um eine leere
  12. Fomularklasse zu erstellen muss folgendes ausgeführt werden:
  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. Dies erstellt das Verzeichnis <filename>application/forms/</filename> mit der
  21. Klassendatei <filename>Guestbook.php</filename>. Diese Datei ist zu öffnen und so zu
  22. aktualisieren das Sie wie folgt aussieht:
  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. // Setzt die Methode for das Anzeigen des Formulars mit POST
  31. $this->setMethod('post');
  32. // Ein Email Element hinzufügen
  33. $this->addElement('text', 'email', array(
  34. 'label' => 'Deine Email Adresse:',
  35. 'required' => true,
  36. 'filters' => array('StringTrim'),
  37. 'validators' => array(
  38. 'EmailAddress',
  39. )
  40. ));
  41. // Das Kommentar Element hinzufügen
  42. $this->addElement('textarea', 'comment', array(
  43. 'label' => 'Bitte ein Kommentar:',
  44. 'required' => true,
  45. 'validators' => array(
  46. array('validator' => 'StringLength', 'options' => array(0, 20))
  47. )
  48. ));
  49. // Ein Captcha hinzufügen
  50. $this->addElement('captcha', 'captcha', array(
  51. 'label' => "Bitte die 5 Buchstaben eingeben die unterhalb "
  52. . "angezeigt werden:",
  53. 'required' => true,
  54. 'captcha' => array(
  55. 'captcha' => 'Figlet',
  56. 'wordLen' => 5,
  57. 'timeout' => 300
  58. )
  59. ));
  60. // Den Submit Button hinzufügen
  61. $this->addElement('submit', 'submit', array(
  62. 'ignore' => true,
  63. 'label' => 'Im Guestbook eintragen',
  64. ));
  65. // Und letztendlich etwas CSRF Protektion hinzufügen
  66. $this->addElement('hash', 'csrf', array(
  67. 'ignore' => true,
  68. ));
  69. }
  70. }
  71. ]]></programlisting>
  72. <para>
  73. Das obige Formular definiert fünf Elemente: ein Feld für die Email Adresse, eines für das
  74. Kommentar, ein <acronym>CAPTCHA</acronym> um Spam Einträge zu verhindern, einen Submit
  75. Button und ein <acronym>CSRF</acronym> Protektions Token.
  76. </para>
  77. <para>
  78. Als nächstes fügen wir eine <methodname>signAction()</methodname> zu unserem
  79. <classname>GuestbookController</classname> welche das Formular nach der Übertragung
  80. bearbeitet. Um die Action und das betreffende View Skript zu erstellen muss das folgende
  81. ausgeführt werden:
  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. Das erstellt eine <methodname>signAction()</methodname> Methode in unserem Controller, sowie
  94. das betreffende View Skript.
  95. </para>
  96. <para>
  97. Fügen wir etwas Logik in unsere Sign Aktion des Guestbook Controller's ein. Wir müssen
  98. zuerst prüfen ob wir eine <acronym>POST</acronym> oder eine <acronym>GET</acronym> Anfrage
  99. erhalten; im letzteren Fall zeigen wir das Formular einfach an. Wenn wir aber eine
  100. <acronym>POST</acronym> Anfrage erhalten, wollten wir die übermittelten Daten gegenüber
  101. unserem Formular prüfen, und wenn es gültig ist, wird ein neuer Eintrag erstellt und
  102. gespeichert. Die Logik könnte wie folgt aussehen:
  103. </para>
  104. <programlisting language="php"><![CDATA[
  105. // application/controllers/GuestbookController.php
  106. class GuestbookController extends Zend_Controller_Action
  107. {
  108. // wir übergehen 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. Natürlich müssen wir das View Skript bearbeiten; es muss
  127. <filename>application/views/scripts/guestbook/sign.phtml</filename> bearbeitet werden damit
  128. es wie folgt aussieht:
  129. </para>
  130. <programlisting language="php"><![CDATA[
  131. <!-- application/views/scripts/guestbook/sign.phtml -->
  132. Bitte verwende das folgende Formular um sich in unser Guestbook einzutragen!
  133. <?php
  134. $this->form->setAction($this->url());
  135. echo $this->form;
  136. ]]></programlisting>
  137. <note>
  138. <title>Besser aussehende Formulare</title>
  139. <para>
  140. Keiner wird sich irgendwann poetisch über die Schönheit dieses Formulars auslassen.
  141. Kein Problem - das Aussehen des Formulars kann komplett angepasst werden! Siehe auch im
  142. <link linkend="zend.form.decorators">Kapitel über Decorations vom Referenz
  143. Handbuch</link> nach Details.
  144. </para>
  145. <para>
  146. Zusätzlich könnte man an <link
  147. linkend="learning.form.decorators.intro">unserem Tutorial über Formular
  148. Decorations</link> interessiert sein.
  149. </para>
  150. </note>
  151. <note>
  152. <title>Checkpoint</title>
  153. <para>
  154. Jetzt gehen wir auf "http://localhost/guestbook/sign". Man sollte das folgende im
  155. eigenen Browser sehen:
  156. </para>
  157. <para>
  158. <inlinegraphic width="421" scale="100" align="center" valign="middle"
  159. fileref="figures/learning.quickstart.create-form.png" format="PNG" />
  160. </para>
  161. </note>
  162. </sect1>