| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 21194 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.validate.introduction">
- <title>Einführung</title>
- <para>
- Die <classname>Zend_Validate</classname> Komponente bietet ein Set von üblich verwendeten
- Prüfungen. Sie bietet auch einen einfachen Prüf-Ketten-Mechanismus mit welchem mehrfache
- Prüfungen zu einem einfachen Wert in einer benutzer-definierten Art und Weise zugeordnet
- werden können.
- </para>
- <sect2 id="zend.validate.introduction.definition">
- <title>Was ist eine Prüfung?</title>
- <para>
- Eine Prüfung untersucht seine Eingabe mit Obacht auf einige Anforderungen und produziert
- ein boolsches Ergebnis - wenn die Eingabe erfolgreich gegen die Anforderungen geprüft
- werden konnte. Wenn die Eingabe den Anforderungen nicht entspricht, kann die Prüfung
- zusätzliche Informationen darüber bieten, welche der Anforderungen die Eingabe nicht
- entspricht.
- </para>
- <para>
- Eine WebAnwendung, zum Beispiel, könnte erfordern das ein Benutzername zwischen sechs
- und zwölf Zeichen lang ist und dürfte nur alphanummerische Zeichen enthalten. Eine
- Prüfung kann dafür verwendet werden um sicherzustellen das Benutzernamen diesen
- Anforderungen entsprechen. Wenn ein gewählter Benutzername einer oder beiden
- Anforderungen nicht entspricht, wäre es nützlich zu wissen welche der Anforderungen der
- Benutzername nicht entsprochen hat.
- </para>
- </sect2>
- <sect2 id="zend.validate.introduction.using">
- <title>Standardnutzung von Prüfungen</title>
- <para>
- Prüfungen auf diesem Weg definiert zu haben, bietet die Sammlung für
- <classname>Zend_Validate_Interface</classname> welche zwei Methoden definiert,
- <methodname>isValid()</methodname> und <methodname>getMessages()</methodname>. Die
- <methodname>isValid()</methodname> Methode führt eine Prüfung über die angegebenen Werte
- aus, und gibt nur dann <constant>TRUE</constant> zurück wenn der Wert gegenüber den
- Kriterien der Prüfung entsprochen hat.
- </para>
- <para>
- Wenn <methodname>isValid()</methodname> <constant>FALSE</constant> zurück gibt, bietet
- <methodname>getMessages()</methodname> ein Array von Nachrichten welche die Gründe für
- die fehlgeschlagene Prüfung beschreiben. Die Arrayschlüssel sind kurze Strings die die
- Gründe für eine fehlgeschlagene Prüfung identifizieren, und die Arraywerte sind die
- entsprechend menschlich-lesbaren String Nachrichten. Die Schlüssel und Werte sind
- Klassenabhängig; jede Prüfklasse definiert Ihr eigenes Set von Nachrichten für
- fehlgeschlagene Prüfungen und die eindeutigen Schlüssel die diese identifizieren. Jede
- Klasse hat also eine const Definition die jedem Identifikator für eine
- fehlgeschlagene Prüfung entspricht.
- </para>
- <note>
- <para>
- Die <methodname>getMessages()</methodname> gibt die Information für Prüfungsfehler
- nur für den zuletzt durchgeführten Aufruf von <methodname>isValid()</methodname>
- zurück. Jeder Aufruf von <methodname>isValid()</methodname> löscht jegliche
- Nachricht und Fehler welche durch vorhergehende <methodname>isValid()</methodname>
- Aufrufe vorhanden waren, weil normalerweise jeder Aufruf von
- <methodname>isValid()</methodname> für einen unterschiedlichen Eingabewert gemacht
- wird.
- </para>
- </note>
- <para>
- Das folgende Beispiel zeigt die Prüfung einer E-Mail Adresse:
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_EmailAddress();
- if ($validator->isValid($email)) {
- //
- // E-Mail scheint gültig zu sein
- //
- } else {
- //
- // E-Mail ist ungültig; drucke die Gründe
- //
- foreach ($validator->getMessages() as $messageId => $message) {
- echo "Validation failure '$messageId': $message\n";
- }
- }
- ]]></programlisting>
- </para>
- </sect2>
- <sect2 id="zend.validate.introduction.messages">
- <title>Nachrichten anpassen</title>
- <para>
- Prüf Klassen bieten eine <methodname>setMessage()</methodname> Methode mit der das
- Format der Nachricht definiert werden kann die von
- <methodname>getMessages()</methodname> im Fall einer fehlerhaften Prüfung zurückgegeben
- wird. Das erste Argument dieser Methode ist ein String der die Fehlernachricht enthält.
- Es können Kürzel in den String eingebaut werden welche mit den für die Prüfung
- relevanten Daten aufgefüllt werden. Das Kürzel <emphasis>%value%</emphasis> wird von
- allen Prüfungen unterstützt; es ist verbunden mit dem Wert der an
- <methodname>isValid()</methodname> übergeben wird. Andere Kürzel können unterstützt
- werden von Fall-zu-Fall in jeder Prüfer-Klasse. Zum Beispiel ist
- <emphasis>%max%</emphasis> das Kürzel welches von
- <classname>Zend_Validate_LessThan</classname> unterstützt wird. Die
- <methodname>getMessageVariables()</methodname> Methode give ein Array von variablen
- Kürzel zurück welche vom Prüfer unterstützt werden.
- </para>
- <para>
- Das zweite optionale Argument ist ein String der das Template der fehlerhaften
- Prüfnachricht die gesetzt werden soll identifiziert. Das ist nützlich wenn eine
- Prüfklasse mehr als einen Grund für einen Fehlschlag definiert. Wenn das zweite Argument
- nicht angegeben wird, nimmt <methodname>setMessage()</methodname> an das die
- spezifizierte Nachricht für das erste Messagetemplate verwendet werden soll das in der
- Prüfklasse definiert ist. Viele Prüfklassen haben nur ein Template für eine
- Fehlernachricht definiert, sodas es nicht notwendig ist anzugeben welches Template für
- Fehlernachrichten geändert werden soll.
- </para>
- <para>
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_StringLength(8);
- $validator->setMessage(
- 'Der String \'%value%\' ist zu kurz; er muss mindestens %min% ' .
- 'Zeichen sein',
- Zend_Validate_StringLength::TOO_SHORT);
- if (!$validator->isValid('word')) {
- $messages = $validator->getMessages();
- echo $messages[0];
- // "Der String 'word' ist zu kurz; er muss mindestens 8 Zeichen sein"
- }
- ]]></programlisting>
- </para>
- <para>
- Es können mehrere Nachrichten gesetzt werden durch Verwendung der
- <methodname>setMessages()</methodname> Methode. Dessen Argument ist ein Array welches
- Schlüssel/Nachrichten Paare enthält.
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
- $validator->setMessages( array(
- Zend_Validate_StringLength::TOO_SHORT =>
- 'Der String \'%value%\' ist zu kurz',
- Zend_Validate_StringLength::TOO_LONG =>
- 'Der String \'%value%\' ist zu lang'
- ));
- ]]></programlisting>
- </para>
- <para>
- Wenn die Anwendung mehr Flexibilität benötigt in der Art und Weise wie Prüffehler
- gemeldet werden, kann auf die Eigenschaften durch den selben Namen zugegriffen
- werden wie mit dem Nachrichten Kürzel das von einer Prüfklasse unterstützt wird.
- Die <property>value</property> Eigenschaft ist immer in einem Prüfer vorhanden; Das ist
- der Wert der als Argument von <methodname>isValid()</methodname> definiert wurde. Andere
- Eigenschaften können von Fall zu Fall in jeder Prüfklasse unterstützt werden.
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
- if (!validator->isValid('word')) {
- echo 'Wort fehlgeschlaten: '
- . $validator->value
- . '; die Länge ist nicht zwischen '
- . $validator->min
- . ' und '
- . $validator->max
- . "\n";
- }
- ]]></programlisting>
- </para>
- </sect2>
- <sect2 id="zend.validate.introduction.static">
- <title>Verwenden der statischen is() Methode</title>
- <para>
- Wenn es nicht gebräuchlich ist eine gegebenen Prüfklasse zu laden und eine Instanz
- des Prüfers zu erstellen, kann die statische Methode
- <methodname>Zend_Validate::is()</methodname> verwendet werden als alternativer Stil des
- Aufrufs. Das erste Argument dieser Methode ist ein Datenwert, der an die
- <methodname>isValid()</methodname> Methode übergeben werden würde. Das zweite Argument
- ist ein String, welcher mit dem Basisnamen der Prüfklasse übereinstimmt, relativ zum
- Namensraum von <classname>Zend_Validate</classname>. Die <methodname>is()</methodname>
- Methode lädt die Klasse automatisch, erstellt eine Instanz und wendet die
- <methodname>isValid()</methodname> Methode an den Eingabedaten an.
- <programlisting language="php"><![CDATA[
- if (Zend_Validate::is($email, 'EmailAddress')) {
- // Ja, die Email Adresse scheint gültig zu sein
- }
- ]]></programlisting>
- </para>
- <para>
- Es kann auch ein Array von Konstruktor Argumenten übergeben werden, wenn diese für die
- Prüfung benötigt werden.
- <programlisting language="php"><![CDATA[
- if (Zend_Validate::is($value, 'Between', array('min' => 1, 'max' => 12))) {
- // Ja, $value ist zwischen 1 und 12
- }
- ]]></programlisting>
- </para>
- <para>
- Die <methodname>is()</methodname> Methode gibt einen boolschen Wert zurück, denselben
- wie die <methodname>isValid()</methodname> Methode. Wird die statische
- <methodname>is()</methodname> Methode verwendet, sind Nachrichten für Prüffehler nicht
- vorhanden.
- </para>
- <para>
- Die statische Verwendung kann bequem sein für das ad hoc Verwenden eines Prüfers,
- aber wenn ein Prüfer für mehrere Eingaben verwendet werden soll ist es effizienter
- die nicht statische Verwendung zu benutzen, indem eine Instanz des Prüf Objektes
- erstellt wird und dessen <methodname>isValid()</methodname> Methode aufgerufen wird.
- </para>
- <para>
- Die <classname>Zend_Filter_Input</classname> Klasse erlaubt es auch mehrfache Filter und
- Prüfklassen zu instanzieren und bei Bedarf aufzurufen um Sets von Eingabedaten zu
- bearbeiten. Siehe <xref linkend="zend.filter.input" />.
- </para>
- <sect3 id="zend.validate.introduction.static.namespaces">
- <title>Namespaces</title>
- <para>
- Wenn man mit selbst definierten Prüfungen arbeitet, dann kann man an
- <methodname>Zend_Validate::is()</methodname> einen vierten Parameter übergeben
- welcher der Namespace ist, an dem die eigene Prüfung gefunden werden kann.
- </para>
- <programlisting language="php"><![CDATA[
- if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12),
- array('FirstNamespace', 'SecondNamespace')) {
- // Ja, $value ist in Ordnung
- }
- ]]></programlisting>
- <para>
- <classname>Zend_Validate</classname> erlaubt es auch standardmäßige Namespaces zu
- setzen. Das bedeutet das man Sie einmal in der Bootstrap setzt und sie nicht mehr
- bei jedem Aufruf von <methodname>Zend_Validate::is()</methodname> angeben muß. Der
- folgende Codeschnipsel ist identisch mit dem vorherigen.
- </para>
- <programlisting language="php"><![CDATA[
- Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
- if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12)) {
- // Yes, $value is ok
- }
- if (Zend_Validate::is($value, 'OtherValidator', array('min' => 1, 'max' => 12)) {
- // Yes, $value is ok
- }
- ]]></programlisting>
- <para>
- Der Bequemlichkeit halber gibt es die folgenden Methoden welche die Behandlung von
- Namespaces erlauben:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis><methodname>Zend_Validate::getDefaultNamespaces()</methodname></emphasis>:
- Gibt alle standardmäßigen Namespaces als Array zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><methodname>Zend_Validate::setDefaultNamespaces()</methodname></emphasis>:
- Setzt neue standardmäßige Namespaces und überschreibt alle vorher
- gesetzten. Es wird entweder ein String für einen einzelnen Namespace
- akzeptiert, oder ein Array für mehrere Namespaces.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><methodname>Zend_Validate::addDefaultNamespaces()</methodname></emphasis>:
- Fügt zusätzliche Namespaces zu den bereits gesetzten hinzu. Es wird
- entweder ein String für einen einzelnen Namespace akzeptiert, oder ein
- Array für mehrere Namespaces.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><methodname>Zend_Validate::hasDefaultNamespaces()</methodname></emphasis>:
- Gibt <constant>TRUE</constant> zurück wenn ein oder mehrere standardmäßige
- Namespaces gesetzt sind, und <constant>FALSE</constant> wenn keine
- standardmäßigen Namespaces gesetzt sind.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
- <sect2 id="zend.validate.introduction.translation">
- <title>Meldungen übersetzen</title>
- <para>
- Prüfungsklassen bieten eine <methodname>setTranslator()</methodname> Methode mit der man
- eine Instanz von <classname>Zend_Translate</classname> definieren kann die Nachrichten
- im Falle eines Prüfungsfehlers übersetzt. Die <methodname>getTranslator()</methodname>
- Methode gibt die gesetzte Übersetzungsinstanz zurück.
- </para>
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
- $translate = new Zend_Translate(
- 'array',
- array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
- 'en'
- );
- $validator->setTranslator($translate);
- ]]></programlisting>
- <para>
- Mit der statischen Methode <methodname>setDefaultTranslator()</methodname> kann eine
- Instanz von <classname>Zend_Translate</classname> gesetzt werden, und mit
- <methodname>getDefaultTranslator()</methodname> empfangen. Das verhindert das man den
- Übersetzer manuell für alle Prüfungsklassen setzen muß und vereinfacht den Code.
- </para>
- <programlisting language="php"><![CDATA[
- $translate = new Zend_Translate(
- 'array',
- array(Zend_Validate_StringLength::TOO_SHORT => 'Übersetzt \'%value%\''),
- 'en'
- );
- Zend_Validate::setDefaultTranslator($translate);
- ]]></programlisting>
- <note>
- <para>
- Wenn man ein Anwendungsweites Gebietsschema in der Registry gesetzt hat, wird
- dieses Gebietsschema als standardmäßiger Übersetzer verwendet.
- </para>
- </note>
- <para>
- Machmal ist es notwendig den Übersetzer in einer Prüfklasse auszuschalten. Um das zu
- tun kann die <methodname>setDisableTranslator()</methodname> Methode verwendet werden,
- welche einen boolschen Wert akzeptiert und
- <methodname>translatorIsDisabled()</methodname> um den gesetzten Wert zu erhalten.
- </para>
- <programlisting language="php"><![CDATA[
- $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
- if (!$validator->isTranslatorDisabled()) {
- $validator->setDisableTranslator();
- }
- ]]></programlisting>
- <para>
- Es ist auch möglich einen Übersetzer zu verwenden statt eigene Meldungen mit
- <methodname>setMessage()</methodname> zu setzen. Aber wenn man das tut, sollte man im
- Kopf behalten das der Übersetzer auch mit den Meldungen arbeitet die man selbst gesetzt
- hat.
- </para>
- </sect2>
- </sect1>
|