Zend_Validate.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15207 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. Die Zend_Validate Komponente bietet ein Set von üblich verwendeten Prüfungen. Sie bietet auch einen einfachen
  8. Prüf-Ketten-Mechanismus mit welchem mehrfache Prüfungen zu einem einfachen Wert in einer benutzer-definierten
  9. Art und Weise zugeordnet werden können.
  10. </para>
  11. <sect2 id="zend.validate.introduction.definition">
  12. <title>Was ist eine Prüfung?</title>
  13. <para>
  14. Eine Prüfung untersucht seine Eingabe mit Obacht auf einige Anforderungen und produziert ein boolsches
  15. Ergebnis - wenn die Eingabe erfolgreich gegen die Anforderungen geprüft werden konnte. Wenn die Eingabe
  16. den Anforderungen nicht entspricht, kann die Prüfung zusätzliche Informationen darüber bieten, welche
  17. der Anforderungen die Eingabe nicht entspricht.
  18. </para>
  19. <para>
  20. Eine WebAnwendung, zum Beispiel, könnte erfordern das ein Benutzername zwischen sechs und zwölf Zeichen
  21. lang ist und dürfte nur alphanummerische Zeichen enthalten. Eine Prüfung kann dafür verwendet werden um
  22. sicherzustellen das Benutzernamen diesen Anforderungen entsprechen. Wenn ein gewählter Benutzername einer
  23. oder beiden Anforderungen nicht entspricht, wäre es nützlich zu wissen welche der Anforderungen der
  24. Benutzername nicht entsprochen hat.
  25. </para>
  26. </sect2>
  27. <sect2 id="zend.validate.introduction.using">
  28. <title>Standardnutzung von Prüfungen</title>
  29. <para>
  30. Prüfungen auf diesem Weg definiert zu haben, bietet die Sammlung für <classname>Zend_Validate_Interface</classname>
  31. welche zwei Methoden definiert, <code>isValid()</code> und <code>getMessages()</code>. Die
  32. <code>isValid()</code> Methode führt eine Prüfung über die angegebenen Werte aus, und gibt nur dann
  33. <code>true</code> zurück wenn der Wert gegenüber den Kriterien der Prüfung entsprochen hat.
  34. </para>
  35. <para>
  36. Wenn <code>isValid()</code> <code>false</code> zurück gibt, bietet <code>getMessages()</code> ein Array von
  37. Nachrichten welche die Gründe für die fehlgeschlagene Prüfung beschreiben. Die Arrayschlüssel sind
  38. kurze Strings die die Gründe für eine fehlgeschlagene Prüfung identifizieren, und die Arraywerte
  39. sind die entsprechend menschlich-lesbaren String Nachrichten. Die Schlüssel und Werte sind
  40. Klassenabhängig; jede Prüfklasse definiert Ihr eigenes Set von Nachrichten für fehlgeschlagene
  41. Prüfungen und die eindeutigen Schlüssel die diese identifizieren. Jede klasse hat also eine
  42. <code>const</code> Definition die jedem Identifikator für eine fehlgeschlagene Prüfung entspricht.
  43. </para>
  44. <note>
  45. <para>
  46. Die <code>getMessages()</code> gibt die Information für Prüfungsfehler nur für den zuletzt
  47. durchgeführten Aufruf von <code>isValid()</code> zurück. Jeder Aufruf von <code>isValid()</code>
  48. löscht jegliche Nachricht und Fehler welche durch vorhergehende <code>isValid()</code> Aufrufe
  49. vorhanden waren, weil normalerweise jeder Aufruf von <code>isValid()</code> für einen
  50. unterschiedlichen Eingabewert gemacht wird.
  51. </para>
  52. </note>
  53. <para>
  54. Das folgende Beispiel zeigt die Prüfung einer E-Mail Adresse:
  55. <programlisting role="php"><![CDATA[
  56. $validator = new Zend_Validate_EmailAddress();
  57. if ($validator->isValid($email)) {
  58. //
  59. // E-Mail scheint gültig zu sein
  60. //
  61. } else {
  62. //
  63. // E-Mail ist ungültig; drucke die Gründe
  64. //
  65. foreach ($validator->getMessages() as $messageId => $message) {
  66. echo "Validation failure '$messageId': $message\n";
  67. }
  68. }
  69. ]]></programlisting>
  70. </para>
  71. </sect2>
  72. <sect2 id="zend.validate.introduction.messages">
  73. <title>Nachrichten anpassen</title>
  74. <para>
  75. Prüf Klassen bieten eine <code>setMessage()</code> Methode mit der das Format der Nachricht
  76. definiert werden kann die von <code>getMessages()</code> im Fall einer fehlerhaften Prüfung
  77. zurückgegeben wird. Das erste Argument dieser Methode ist ein String der die Fehlernachricht
  78. enthält. Es können Kürzel in den String eingebaut werden welche mit den für die Prüfung relevanten
  79. Daten aufgefüllt werden. Das Kürzel <code>%value%</code> wird von allen Prüfungen unterstützt;
  80. es ist verbunden mit dem Wert der an <code>isValid()</code> übergeben wird.
  81. Andere Kürzel können unterstützt werden von Fall-zu-Fall in jeder Prüfer-Klasse. Zum Beispiel ist
  82. <code>%max%</code> das Kürzel welches von <classname>Zend_Validate_LessThan</classname> unterstützt wird.
  83. Die <code>getMessageVariables()</code> Methode give ein Array von variablen Kürzel zurück
  84. welche vom Prüfer unterstützt werden.
  85. </para>
  86. <para>
  87. Das zweite optionale Argument ist ein String der das Template der fehlerhaften Prüfnachricht
  88. die gesetzt werden soll identifiziert. Das ist nützlich wenn eine Prüfklasse mehr als einen
  89. Grund für einen Fehlschlag definiert. Wenn das zweite Argument nicht angegeben wird, nimmt
  90. <code>setMessage()</code> an das die spezifizierte Nachricht für das erste Messagetemplate
  91. verwendet werden soll das in der Prüfklasse definiert ist. Viele Prüfklassen haben nur ein
  92. Template für eine Fehlernachricht definiert, sodas es nicht notwendig ist anzugeben welches
  93. Template für Fehlernachrichten geändert werden soll.
  94. </para>
  95. <para>
  96. <programlisting role="php"><![CDATA[
  97. $validator = new Zend_Validate_StringLength(8);
  98. $validator->setMessage(
  99. 'Der String \'%value%\' ist zu kurz; er muss mindestens %min% ' .
  100. 'Zeichen sein',
  101. Zend_Validate_StringLength::TOO_SHORT);
  102. if (!$validator->isValid('word')) {
  103. $messages = $validator->getMessages();
  104. echo $messages[0];
  105. // "Der String 'word' ist zu kurz; er muss mindestens 8 Zeichen sein"
  106. }
  107. ]]></programlisting>
  108. </para>
  109. <para>
  110. Es können mehrere Nachrichten gesetzt werden durch Verwendung der <code>setMessages()</code>
  111. Methode. Dessen Argument ist ein Array welches Schlüssel/Nachrichten Paare enthält.
  112. <programlisting role="php"><![CDATA[
  113. $validator = new Zend_Validate_StringLength(8, 12);
  114. $validator->setMessages( array(
  115. Zend_Validate_StringLength::TOO_SHORT =>
  116. 'Der String \'%value%\' ist zu kurz',
  117. Zend_Validate_StringLength::TOO_LONG =>
  118. 'Der String \'%value%\' ist zu lang'
  119. ));
  120. ]]></programlisting>
  121. </para>
  122. <para>
  123. Wenn die Anwendung mehr Flexibilität benötigt in der Art und Weise wie Prüffehler
  124. gemeldet werden, kann auf die Eigenschaften durch den selben Namen zugegriffen
  125. werden wie mit dem Nachrichten Kürzel das von einer Prüfklasse unterstützt wird.
  126. Die <code>value</code> Eigenschaft ist immer in einem Prüfer vorhanden; Das ist
  127. der Wert der als Argument von <code>isValid()</code> definiert wurde. Andere
  128. Eigenschaften können von Fall zu Fall in jeder Prüfklasse unterstützt werden.
  129. <programlisting role="php"><![CDATA[
  130. $validator = new Zend_Validate_StringLength(8, 12);
  131. if (!validator->isValid('word')) {
  132. echo 'Wort fehlgeschlaten: '
  133. . $validator->value
  134. . '; die Länge ist nicht zwischen '
  135. . $validator->min
  136. . ' und '
  137. . $validator->max
  138. . "\n";
  139. }
  140. ]]></programlisting>
  141. </para>
  142. </sect2>
  143. <sect2 id="zend.validate.introduction.static">
  144. <title>Verwenden der statischen is() Methode</title>
  145. <para>
  146. Wenn es nicht gebräuchlich ist eine gegebenen Prüfklasse zu laden und eine Instanz
  147. des Prüfers zu erstellen, kann die statische Methode <classname>Zend_Validate::is()</classname>
  148. verwendet werden als alternativer Stil des Aufrufs. Das erste Argument dieser
  149. Methode ist ein Datenwert, der an die <code>isValid()</code> Methode übergeben werden
  150. würde. Das zweite Argument ist ein String, welcher mit dem Basisnamen der Prüfklasse
  151. übereinstimmt, relativ zum Namensraum von <classname>Zend_Validate</classname>. Die <code>is()</code>
  152. Methode lädt die Klasse automatisch, erstellt eine Instanz und wendet die
  153. <code>isValid()</code> Methode an den Eingabedaten an.
  154. <programlisting role="php"><![CDATA[
  155. if (Zend_Validate::is($email, 'EmailAddress')) {
  156. // Ja, die Email Adresse scheint gültig zu sein
  157. }
  158. ]]></programlisting>
  159. </para>
  160. <para>
  161. Es kann auch ein Array von Konstruktor Argumenten übergeben werden, wenn diese für die
  162. Prüfung benötigt werden.
  163. <programlisting role="php"><![CDATA[
  164. if (Zend_Validate::is($value, 'Between', array(1, 12))) {
  165. // Ja, $value ist zwischen 1 und 12
  166. }
  167. ]]></programlisting>
  168. </para>
  169. <para>
  170. Die <code>is()</code> Methode gibt einen boolschen Wert zurück, denselben wie die
  171. <code>isValid()</code> Methode. Wird die statische <code>is()</code> Methode verwendet,
  172. sind Nachrichten für Prüffehler nicht vorhanden.
  173. </para>
  174. <para>
  175. Die statische Verwendung kann bequem sein für das ad hoc Verwenden eines Prüfers,
  176. aber wenn ein Prüfer für mehrere Eingaben verwendet werden soll ist es effizienter
  177. die nicht statische Verwendung zu benutzen, indem eine Instanz des Prüf Objektes
  178. erstellt wird und dessen <code>isValid()</code> Methode aufgerufen wird.
  179. </para>
  180. <para>
  181. Die <classname>Zend_Filter_Input</classname> Klasse erlaubt es auch mehrfache Filter und Prüfklassen
  182. zu instanzieren und bei Bedarf aufzurufen um Sets von Eingabedaten zu bearbeiten. Siehe
  183. <xref linkend="zend.filter.input" />.
  184. </para>
  185. </sect2>
  186. <sect2 id="zend.validate.introduction.translation">
  187. <title>Meldungen übersetzen</title>
  188. <para>
  189. Prüfungsklassen bieten eine <code>setTranslator()</code> Methode mit der man eine
  190. Instanz von <classname>Zend_Translate</classname> definieren kann die Nachrichten im Falle eines
  191. Prüfungsfehlers übersetzt. Die <code>getTranslator()</code> Methode gibt die gesetzte
  192. Übersetzungsinstanz zurück.
  193. </para>
  194. <programlisting role="php"><![CDATA[
  195. $validator = new Zend_Validate_StringLength(8, 12);
  196. $translate = new Zend_Translate(
  197. 'array',
  198. array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
  199. 'en'
  200. );
  201. $validator->setTranslator($translate);
  202. ]]></programlisting>
  203. <para>
  204. Mit der statischen Methode <code>setDefaultTranslator()</code> kann eine Instanz von
  205. <classname>Zend_Translate</classname> gesetzt werden, und mit <code>getDefaultTranslator()</code>
  206. empfangen. Das verhindert das man den Übersetzer manuell für alle Prüfungsklassen
  207. setzen muß und vereinfacht den Code.
  208. </para>
  209. <programlisting role="php"><![CDATA[
  210. $translate = new Zend_Translate(
  211. 'array',
  212. array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
  213. 'en'
  214. );
  215. Zend_Validate::setDefaultTranslator($translate);
  216. ]]></programlisting>
  217. <note>
  218. <para>
  219. Wenn man ein Anwendungsweites Gebietsschema in der Registry gesetzt hat, wird
  220. dieses Gebietsschema als standardmäßiger Übersetzer verwendet.
  221. </para>
  222. </note>
  223. <para>
  224. Machmal ist es notwendig den Übersetzer in einer Prüfklasse auszuschalten. Um das zu
  225. tun kann die <code>setDisableTranslator()</code> Methode verwendet werden, welche einen
  226. boolschen Wert akzeptiert und <code>translatorIsDisabled()</code> um den gesetzten
  227. Wert zu erhalten.
  228. </para>
  229. <programlisting role="php"><![CDATA[
  230. $validator = new Zend_Validate_StringLength(8, 12);
  231. if (!$validator->isTranslatorDisabled()) {
  232. $validator->setDisableTranslator();
  233. }
  234. ]]></programlisting>
  235. <para>
  236. Es ist auch möglich einen Übersetzer zu verwenden statt eigene Meldungen mit
  237. <code>setMessage()</code> zu setzen. Aber wenn man das tut, sollte man im Kopf behalten
  238. das der Übersetzer auch mit den Meldungen arbeitet die man selbst gesetzt hat.
  239. </para>
  240. </sect2>
  241. </sect1>
  242. <!--
  243. vim:se ts=4 sw=4 et:
  244. -->