quickstart-create-form.xml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19777 -->
  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 CAPTCHA um Spam Einträge zu verhindern, einen Submit Button und ein CSRF
  67. 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 POST oder eine GET Anfrage erhalten; im letzteren Fall zeigen wir
  88. das Formular einfach an. Wenn wir aber eine POST Anfrage erhalten, wollten wir die
  89. übermittelten Daten gegenüber unserem Formular prüfen, und wenn es gültig ist, wird ein
  90. neuer Eintrag erstellt und gespeichert. Die Logik könnte wie folgt aussehen:
  91. </para>
  92. <programlisting language="php"><![CDATA[
  93. // application/controllers/GuestbookController.php
  94. class GuestbookController extends Zend_Controller_Action
  95. {
  96. // wir übergehen indexAction()...
  97. public function signAction()
  98. {
  99. $request = $this->getRequest();
  100. $form = new Default_Form_Guestbook();
  101. if ($this->getRequest()->isPost()) {
  102. if ($form->isValid($request->getPost())) {
  103. $model = new Default_Model_Guestbook($form->getValues());
  104. $model->save();
  105. return $this->_helper->redirector('index');
  106. }
  107. }
  108. $this->view->form = $form;
  109. }
  110. }
  111. ]]></programlisting>
  112. <para>
  113. Natürlich müssen wir das View Skript bearbeiten; es muss
  114. <filename>application/views/scripts/guestbook/sign.phtml</filename> bearbeitet werden damit
  115. es wie folgt aussieht:
  116. </para>
  117. <programlisting language="php"><![CDATA[
  118. <!-- application/views/scripts/guestbook/sign.phtml -->
  119. Bitte verwende das folgende Formular um sich in unser Guestbook einzutragen!
  120. <?php
  121. $this->form->setAction($this->url());
  122. echo $this->form;
  123. ]]></programlisting>
  124. <note>
  125. <title>Besser aussehende Formulare</title>
  126. <para>
  127. Keiner wird sich irgendwann poetisch über die Schönheit dieses Formulars auslassen.
  128. Kein Problem - das Aussehen des Formulars kann komplett angepasst werden! Siehe auch im
  129. <link linkend="zend.form.decorators">Kapitel über Decorations vom Referenz
  130. Handbuch</link> nach Details.
  131. </para>
  132. <para>
  133. Zusätzlich könnte man an <ulink
  134. url="http://weierophinney.net/matthew/plugin/tag/decorators">dieser Serie von
  135. Einträgen über Decorators interessiert sein</ulink>.
  136. </para>
  137. </note>
  138. <note>
  139. <title>Checkpoint</title>
  140. <para>
  141. Jetzt gehen wir auf "http://localhost/guestbook/sign". Man sollte das folgende im
  142. eigenen Browser sehen:
  143. </para>
  144. <para>
  145. <inlinegraphic width="421" scale="100" align="center" valign="middle"
  146. fileref="figures/learning.quickstart.create-form.png" format="PNG" />
  147. </para>
  148. </note>
  149. </sect1>