quickstart-create-form.xml 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20106 -->
  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. Zuerst muss das
  12. Verzeichnis <filename>application/forms/</filename> erstellt werden. Dieses Verzeichnis
  13. enthält Formularklassen für die Anwendung. Als nächstes Erstellen wir eine Formularklasse
  14. in <filename>application/forms/Guestbook.php</filename>:
  15. </para>
  16. <programlisting language="php"><![CDATA[
  17. // application/forms/Guestbook.php
  18. class Default_Form_Guestbook extends Zend_Form
  19. {
  20. public function init()
  21. {
  22. // Setzt die Methode for das Anzeigen des Formulars mit POST
  23. $this->setMethod('post');
  24. // Ein Email Element hinzufügen
  25. $this->addElement('text', 'email', array(
  26. 'label' => 'Deine Email Adresse:',
  27. 'required' => true,
  28. 'filters' => array('StringTrim'),
  29. 'validators' => array(
  30. 'EmailAddress',
  31. )
  32. ));
  33. // Das Kommentar Element hinzufügen
  34. $this->addElement('textarea', 'comment', array(
  35. 'label' => 'Bitte ein Kommentar:',
  36. 'required' => true,
  37. 'validators' => array(
  38. array('validator' => 'StringLength', 'options' => array(0, 20))
  39. )
  40. ));
  41. // Ein Captcha hinzufügen
  42. $this->addElement('captcha', 'captcha', array(
  43. 'label' => "Bitte die 5 Buchstaben eingeben die unterhalb "
  44. . "angezeigt werden:",
  45. 'required' => true,
  46. 'captcha' => array(
  47. 'captcha' => 'Figlet',
  48. 'wordLen' => 5,
  49. 'timeout' => 300
  50. )
  51. ));
  52. // Den Submit Button hinzufügen
  53. $this->addElement('submit', 'submit', array(
  54. 'ignore' => true,
  55. 'label' => 'Im Guestbook eintragen',
  56. ));
  57. // Und letztendlich etwas CSRF Protektion hinzufügen
  58. $this->addElement('hash', 'csrf', array(
  59. 'ignore' => true,
  60. ));
  61. }
  62. }
  63. ]]></programlisting>
  64. <para>
  65. Das obige Formular definiert fünf Elemente: ein Feld für die Email Adresse, eines für das
  66. Kommentar, ein <acronym>CAPTCHA</acronym> um Spam Einträge zu verhindern, einen Submit
  67. Button und ein <acronym>CSRF</acronym> Protektions Token.
  68. </para>
  69. <para>
  70. Als nächstes fügen wir eine <methodname>signAction()</methodname> zu unserem
  71. <classname>GuestbookController</classname> welche das Formular nach der Übertragung
  72. bearbeitet. Um die Action und das betreffende View Skript zu erstellen muss das folgende
  73. ausgeführt werden:
  74. </para>
  75. <programlisting language="shell"><![CDATA[
  76. # Unix-artige Systeme:
  77. % zf.sh create action sign guestbook
  78. # DOS/Windows:
  79. C:> zf.bat create action sign guestbook
  80. ]]></programlisting>
  81. <para>
  82. Das erstellt eine <methodname>signAction()</methodname> Methode in unserem Controller, sowie
  83. das betreffende View Skript.
  84. </para>
  85. <para>
  86. Fügen wir etwas Logik in unsere Sign Aktion des Guestbook Controller's ein. Wir müssen
  87. zuerst prüfen ob wir eine <acronym>POST</acronym> oder eine <acronym>GET</acronym> Anfrage
  88. erhalten; im letzteren Fall zeigen wir das Formular einfach an. Wenn wir aber eine
  89. <acronym>POST</acronym> Anfrage erhalten, wollten wir die übermittelten Daten gegenüber
  90. unserem Formular prüfen, und wenn es gültig ist, wird ein neuer Eintrag erstellt und
  91. gespeichert. Die Logik könnte wie folgt aussehen:
  92. </para>
  93. <programlisting language="php"><![CDATA[
  94. // application/controllers/GuestbookController.php
  95. class GuestbookController extends Zend_Controller_Action
  96. {
  97. // wir übergehen indexAction()...
  98. public function signAction()
  99. {
  100. $request = $this->getRequest();
  101. $form = new Default_Form_Guestbook();
  102. if ($this->getRequest()->isPost()) {
  103. if ($form->isValid($request->getPost())) {
  104. $model = new Default_Model_Guestbook($form->getValues());
  105. $model->save();
  106. return $this->_helper->redirector('index');
  107. }
  108. }
  109. $this->view->form = $form;
  110. }
  111. }
  112. ]]></programlisting>
  113. <para>
  114. Natürlich müssen wir das View Skript bearbeiten; es muss
  115. <filename>application/views/scripts/guestbook/sign.phtml</filename> bearbeitet werden damit
  116. es wie folgt aussieht:
  117. </para>
  118. <programlisting language="php"><![CDATA[
  119. <!-- application/views/scripts/guestbook/sign.phtml -->
  120. Bitte verwende das folgende Formular um sich in unser Guestbook einzutragen!
  121. <?php
  122. $this->form->setAction($this->url());
  123. echo $this->form;
  124. ]]></programlisting>
  125. <note>
  126. <title>Besser aussehende Formulare</title>
  127. <para>
  128. Keiner wird sich irgendwann poetisch über die Schönheit dieses Formulars auslassen.
  129. Kein Problem - das Aussehen des Formulars kann komplett angepasst werden! Siehe auch im
  130. <link linkend="zend.form.decorators">Kapitel über Decorations vom Referenz
  131. Handbuch</link> nach Details.
  132. </para>
  133. <para>
  134. Zusätzlich könnte man an <ulink
  135. url="http://weierophinney.net/matthew/plugin/tag/decorators">dieser Serie von
  136. Einträgen über Decorators interessiert sein</ulink>.
  137. </para>
  138. </note>
  139. <note>
  140. <title>Checkpoint</title>
  141. <para>
  142. Jetzt gehen wir auf "http://localhost/guestbook/sign". Man sollte das folgende im
  143. eigenen Browser sehen:
  144. </para>
  145. <para>
  146. <inlinegraphic width="421" scale="100" align="center" valign="middle"
  147. fileref="figures/learning.quickstart.create-form.png" format="PNG" />
  148. </para>
  149. </note>
  150. </sect1>