Zend_Form-Elements.xml 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21825 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.form.elements">
  5. <title>Erstellen von Form Elementen mit Hilfe von Zend_Form_Element</title>
  6. <para>
  7. Ein Formular ist aus Elementen gemacht, die typischerweise mit einer <acronym>HTML</acronym>
  8. Form Eingabe korrespondieren. <classname>Zend_Form_Element</classname> kapselt einzelne
  9. Formularelemente mit den folgenden Bereichen die erfüllt werden sollen:
  10. </para>
  11. <itemizedlist>
  12. <listitem>
  13. <para>
  14. Prüfung (ist der übertragene Wert gültig?)
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>Fangen von Fehlercodes und Nachrichten von Prüfungen</para>
  19. </listitem>
  20. </itemizedlist>
  21. </listitem>
  22. <listitem>
  23. <para>
  24. Filtern (wie wird das Element in Anführungsstriche gesetzt oder normalisiert bevor
  25. die Prüfung stattfinden und/oder für die Ausgabe?)
  26. </para>
  27. </listitem>
  28. <listitem>
  29. <para>Darstellung (wie wird das Element angezeigt?)</para>
  30. </listitem>
  31. <listitem>
  32. <para>
  33. Metadaten und Attribute (welche Informationen qualifizieren das Element näher?)
  34. </para>
  35. </listitem>
  36. </itemizedlist>
  37. <para>
  38. Die Basisklasse, <classname>Zend_Form_Element</classname>, hat begründete Standardwerte für
  39. viele Fälle, aber es ist am besten die Klasse zu erweitern für oft verwendete speziell
  40. benötigte Elemente. Zusätzlich wird Zend Framework mit einer Anzahl an Standard
  41. <acronym>XHTML</acronym> Elementen ausgeliefert; über diese kann im
  42. <link linkend="zend.form.standardElements">Kapitel über Standard Elemente</link>
  43. nachgelesen werden.
  44. </para>
  45. <sect2 id="zend.form.elements.loaders">
  46. <title>Plugin Loader</title>
  47. <para>
  48. <classname>Zend_Form_Element</classname> verwendet
  49. <link linkend="zend.loader.pluginloader">Zend_Loader_PluginLoader</link> um es
  50. Entwicklern zu erlauben Orte für alternative Prüfungen, Filter und Dekoratoren zu
  51. definieren. Jeder hat seinen eigenen Plugin Loader assoziiert, und generelle
  52. Zugriffspunkte werden verwendet um jeden zu empfangen oder zu ändern.
  53. </para>
  54. <para>
  55. Die folgenden Ladetypen werden mit den verschiedenen Plugin Loader Methoden verwendet:
  56. 'validate', 'filter', und 'decorator'. Die Typnamen sind unabhängig von der
  57. Schreibweise.
  58. </para>
  59. <para>
  60. Die Methoden die für die Interaktion mit Plugin Loadern verwendet werden, sind die
  61. folgenden:
  62. </para>
  63. <itemizedlist>
  64. <listitem>
  65. <para>
  66. <methodname>setPluginLoader($loader, $type)</methodname>:
  67. <varname>$loader</varname> ist das Plugin Loader Objekt selbst, während
  68. <varname>$type</varname> eine der oben spezifizierten Typen ist. Das setzt den
  69. Plugin Loader für den gegebenen Typ auf das neu spezifizierte Loader Objekt.
  70. </para>
  71. </listitem>
  72. <listitem>
  73. <para>
  74. <methodname>getPluginLoader($type)</methodname>: Empfängt den mit
  75. <varname>$type</varname> assoziierten Plugin Loader.
  76. </para>
  77. </listitem>
  78. <listitem>
  79. <para>
  80. <methodname>addPrefixPath($prefix, $path, $type = null)</methodname>: Fügt eine
  81. Präfix/Pfad Assoziation hinzu, Wenn <varname>$type</varname>
  82. <constant>FALSE</constant> ist, wird versucht den Pfad zu allen Loadern
  83. hinzuzufügen durch anhängen des Präfix von jedem "_Validate", "_Filter", und
  84. "_Decorator"; und anhängen des Pfades an "Validate/", "Filter/", und
  85. "Decorator/". Wenn alle extra Formular Elementklassen unter einer üblichen
  86. Hirarchie stehen, ist das die bequemste Methode für das Setzen von
  87. grundsätzlichen Präfixen.
  88. </para>
  89. </listitem>
  90. <listitem>
  91. <para>
  92. <methodname>addPrefixPaths(array $spec)</methodname>: Erlaubt es viele Pfade auf
  93. einmal zu einem oder mehreren Plugin Loadern hinzuzufügen. Sie erwartet das
  94. jedes Arrayelement ein Array mit den Sclüsseln 'path', 'prefix' und 'type' ist.
  95. </para>
  96. </listitem>
  97. </itemizedlist>
  98. <para>
  99. Eigene Prüfungen, Filter und Dekoratoren sind ein einfacher Weg um Funktionalität
  100. zwischen Forms zu teilen und eigene Funktionalitäten zu kapseln.
  101. </para>
  102. <example id="zend.form.elements.loaders.customLabel">
  103. <title>Eigenes Label</title>
  104. <para>
  105. Ein üblicher Verwendungszweck ist es Ersetzungen für Standardklassen anzubieten.
  106. Zum Beispiel wenn man eine andere Implementation des 'Label' Dekorators anbieten
  107. will -- zum Beispiel um immer einen Bindestrich anzufügen -- dann könnte man einen
  108. eigenen 'Label' Dekorator mit einem eigenen Klassenpräfix erstellen, und diesen
  109. zum eigenen Präfix Pfad hinzufügen.
  110. </para>
  111. <para>
  112. Beginnen wir mit einem eigenen Label Dekorator. Wir geben ihm den Klassenpräfix
  113. "My_Decorator", und die Klasse selbst wird in der Datei "My/Decorator/Label.php"
  114. sein.
  115. </para>
  116. <programlisting language="php"><![CDATA[
  117. class My_Decorator_Label extends Zend_Form_Decorator_Abstract
  118. {
  119. protected $_placement = 'PREPEND';
  120. public function render($content)
  121. {
  122. if (null === ($element = $this->getElement())) {
  123. return $content;
  124. }
  125. if (!method_exists($element, 'getLabel')) {
  126. return $content;
  127. }
  128. $label = $element->getLabel() . ':';
  129. if (null === ($view = $element->getView())) {
  130. return $this->renderLabel($content, $label);
  131. }
  132. $label = $view->formLabel($element->getName(), $label);
  133. return $this->renderLabel($content, $label);
  134. }
  135. public function renderLabel($content, $label)
  136. {
  137. $placement = $this->getPlacement();
  138. $separator = $this->getSeparator();
  139. switch ($placement) {
  140. case 'APPEND':
  141. return $content . $separator . $label;
  142. case 'PREPEND':
  143. default:
  144. return $label . $separator . $content;
  145. }
  146. }
  147. }
  148. ]]></programlisting>
  149. <para>
  150. Jetzt kann dem Element mitgeteilt werden diesen Plugin Pfad zu verwenden wenn
  151. nach Dekoratoren gesucht wird:
  152. </para>
  153. <programlisting language="php"><![CDATA[
  154. $element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  155. ]]></programlisting>
  156. <para>
  157. Alternativ kann das bei der Form gemacht werden um sicherzustellen das alle
  158. Dekoratore diesen Pfad verwenden:
  159. </para>
  160. <programlisting language="php"><![CDATA[
  161. $form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  162. ]]></programlisting>
  163. <para>
  164. Wird dieser Pfad hinzugefügt, wenn ein Dekorator hinzugefügt wird, wird der
  165. Pfad 'My/Decorator/' zuerst durchsucht um zu sehen ob der Dekorator dort existiert.
  166. Als Ergebnis wird 'My_Decorator_Label' jetzt verwendet wenn der 'Labe' Dekorator
  167. angefragt wird.
  168. </para>
  169. </example>
  170. </sect2>
  171. <sect2 id="zend.form.elements.filters">
  172. <title>Filter</title>
  173. <para>
  174. Es ist oft nützlich und/oder notwendig einige Normalisierungen an Eingaben vorzunehmen,
  175. bevor diese geprüft werden - zum Beispiel kann es gewünscht sein alles an
  176. <acronym>HTML</acronym> zu entfernen, aber die Prüfungen auf dem verbleibenden
  177. durchzuführen um sicherzustellen, dass die Übertragung gültig ist. Oder man will
  178. Leerzeichen bei Eingaben entfernen, damit eine StringLength Prüfung kein falsches
  179. "Korrekt" zurückgibt. Diese Operationen können durchgeführt werden indem
  180. <classname>Zend_Filter</classname> verwendet wird, und
  181. <classname>Zend_Form_Element</classname> unterstützt Filterketten, was es erlaubt
  182. mehrere, sequentielle Filter zu spezifizieren und anzupassen. Das Filtern geschieht
  183. während der Prüfung und wenn der Wert des Elements über
  184. <methodname>getValue()</methodname> geholt wird:
  185. </para>
  186. <programlisting language="php"><![CDATA[
  187. $filtered = $element->getValue();
  188. ]]></programlisting>
  189. <para>
  190. Filter können der Kette auf zwei Wegen hinzugefügt werden:
  191. </para>
  192. <itemizedlist>
  193. <listitem><para>Übergabe einer konkreten Filterinstanz</para></listitem>
  194. <listitem>
  195. <para>
  196. Angabe eines Filternamens - entweder ein Kurzname oder ein voll qualifizierter
  197. Klassenname
  198. </para>
  199. </listitem>
  200. </itemizedlist>
  201. <para>
  202. Sehen wir uns einige Beispiele an:
  203. </para>
  204. <programlisting language="php"><![CDATA[
  205. // Konkrete Filterinstanz:
  206. $element->addFilter(new Zend_Filter_Alnum());
  207. // Voll qualifizierter Klassenname:
  208. $element->addFilter('Zend_Filter_Alnum');
  209. // Kurzname des Filters:
  210. $element->addFilter('Alnum');
  211. $element->addFilter('alnum');
  212. ]]></programlisting>
  213. <para>
  214. Kurznamen sind typischerweise der Filtername ohne den Präfix. Im Standardfall bedeutet
  215. das keinen 'Zend_Filter_' Präfix. Zusätzlich muss der erste Buchstabe nicht
  216. großgeschrieben werden.
  217. </para>
  218. <note>
  219. <title>Eigene Filterklassen verwenden</title>
  220. <para>
  221. Wenn man sein eigenes Set an Filterklassen hat, kann man
  222. <classname>Zend_Form_Element</classname> mitteilen diese zu verwenden indem
  223. <methodname>addPrefixPath()</methodname> verwendet wird. Wenn man zum Beispiel
  224. eigene Filter unter dem 'My_Filter' Präfix hat, kann
  225. <classname>Zend_Form_Element</classname> dies auf dem folgenden Weg mitgeteilt
  226. werden:
  227. </para>
  228. <programlisting language="php"><![CDATA[
  229. $element->addPrefixPath('My_Filter', 'My/Filter/', 'filter');
  230. ]]></programlisting>
  231. <para>
  232. (Beachten Sie, dass das dritte Agument indiziert welcher Plugin Loader auf welcher
  233. Aktion durchgeführt werden soll.)
  234. </para>
  235. </note>
  236. <para>
  237. Wenn man zu irgendeiner Zeit den ungefilterten Wert benötigt, kann die
  238. <methodname>getUnfilteredValue()</methodname> Methode verwendet werden:
  239. </para>
  240. <programlisting language="php"><![CDATA[
  241. $unfiltered = $element->getUnfilteredValue();
  242. ]]></programlisting>
  243. <para>
  244. Für weitere Informationen über Filter, siehe die
  245. <link linkend="zend.filter.introduction">Dokumentation über Zend_Filter</link>.
  246. </para>
  247. <para>
  248. Die Methoden die mit Filtern assoziiert sind, beinhalten:
  249. </para>
  250. <itemizedlist>
  251. <listitem>
  252. <para>
  253. <methodname>addFilter($nameOfFilter, array $options = null)</methodname>
  254. </para>
  255. </listitem>
  256. <listitem><para><methodname>addFilters(array $filters)</methodname></para></listitem>
  257. <listitem>
  258. <para>
  259. <methodname>setFilters(array $filters)</methodname> (Überschreibt alle Filter)
  260. </para>
  261. </listitem>
  262. <listitem>
  263. <para>
  264. <methodname>getFilter($name)</methodname> (Empfängt ein Filterobjekt durch
  265. seinen Namen)
  266. </para>
  267. </listitem>
  268. <listitem>
  269. <para><methodname>getFilters()</methodname> (Empfängt alle Filter)</para>
  270. </listitem>
  271. <listitem>
  272. <para>
  273. <methodname>removeFilter($name)</methodname> (Entfernt einen Filter durch seinen
  274. Namen)
  275. </para>
  276. </listitem>
  277. <listitem>
  278. <para><methodname>clearFilters()</methodname> (Entfernt alle Filter)</para>
  279. </listitem>
  280. </itemizedlist>
  281. </sect2>
  282. <sect2 id="zend.form.elements.validators">
  283. <title>Prüfungen</title>
  284. <para>
  285. Wenn man das Sicherheits-Mantra von "Eingabe filtern, Ausgabe escapen" unterschreibt
  286. dann wird man die Eingabe des Formulars prüfen ("Eingabefilterung") wollen. In
  287. <classname>Zend_Form</classname> enthält jedes Element seine eigene Prüfkette, die aus
  288. <classname>Zend_Validate_*</classname> Prüfungen besteht.
  289. </para>
  290. <para>
  291. Prüfungen können der Kette auf zwei Wegen hinzugefügt werden:
  292. </para>
  293. <itemizedlist>
  294. <listitem><para>Übergabe einer konkreten Prüfinstanz</para></listitem>
  295. <listitem>
  296. <para>
  297. Anbieten eines Prüfnamens - entweder ein Kurzname oder ein voll qualifizierter
  298. Klassenname
  299. </para>
  300. </listitem>
  301. </itemizedlist>
  302. <para>
  303. Einige Beispiele:
  304. </para>
  305. <programlisting language="php"><![CDATA[
  306. // Konkrete Prüfinstanz:
  307. $element->addValidator(new Zend_Validate_Alnum());
  308. // Voll qualifizierter Klassenname:
  309. $element->addValidator('Zend_Validate_Alnum');
  310. // Kurzer Prüfname:
  311. $element->addValidator('Alnum');
  312. $element->addValidator('alnum');
  313. ]]></programlisting>
  314. <para>
  315. Kurznamen sind typischerweise der Prüfname ohne den Präfix. Im Standardfall bedeutet
  316. das, keinen 'Zend_Validate_' Präfix. Zusätzlich muss der erste Buchstabe nicht
  317. großgeschrieben werden.
  318. </para>
  319. <note>
  320. <title>Eigene Prüfklassen verwenden</title>
  321. <para>
  322. Wenn man sein eigenes Set an Prüfklassen hat, kann man
  323. <classname>Zend_Form_Element</classname> mitteilen diese zu verwenden indem
  324. <methodname>addPrefixPath()</methodname> verwendet wird. Wenn man zum Beispiel
  325. eigene Prüfungen unter dem 'My_Validator' Präfix hat, kann
  326. <classname>Zend_Form_Element</classname> dies auf dem folgenden Weg mitgeteilt
  327. werden:
  328. </para>
  329. <programlisting language="php"><![CDATA[
  330. $element->addPrefixPath('My_Validator', 'My/Validator/', 'validate');
  331. ]]></programlisting>
  332. <para>
  333. (Beachten Sie dass das dritte Agument zeigt welcher Plugin Loader auf welcher
  334. Aktion durchgeführt werden soll)
  335. </para>
  336. </note>
  337. <para>
  338. Wenn eine bestimmte Prüfung fehlschlägt, und die Ausführung von späteren Prüfungen
  339. verhindert werden soll, kann ein <constant>TRUE</constant> als zweiter Parameter
  340. übergeben werden:
  341. </para>
  342. <programlisting language="php"><![CDATA[
  343. $element->addValidator('alnum', true);
  344. ]]></programlisting>
  345. <para>
  346. Wenn ein Stringname verwendet wird, um eine Prüfung hinzuzufügen und die Prüfklasse
  347. Argumente in ihrem Konstruktor akzeptiert, können diese als dritter Parameter an
  348. <methodname>addValidator()</methodname> als Array übergeben werden:
  349. </para>
  350. <programlisting language="php"><![CDATA[
  351. $element->addValidator('StringLength', false, array(6, 20));
  352. ]]></programlisting>
  353. <para>
  354. Argumente die auf diesem Weg übergeben werden, sollten in der Reihenfolge sein in der
  355. sie im Konstruktor definiert sind. Das obige Beispiel instanziert die
  356. <classname>Zend_Validate_StringLenth</classname> Klasse mit den <varname>$min</varname>
  357. und <varname>$max</varname> Parametern:
  358. </para>
  359. <programlisting language="php"><![CDATA[
  360. $validator = new Zend_Validate_StringLength(6, 20);
  361. ]]></programlisting>
  362. <note>
  363. <title>Eigene Fehlermeldungen für Prüfungen anbieten</title>
  364. <para>
  365. Einige Entwickler wollen eigene Fehlermeldungen für eine Prüfung anbieten.
  366. <methodname>Zend_Form_Element::addValidator()</methodname>'s
  367. <varname>$options</varname> Argument erlaubt es das zu tun, indem der Schlüssel
  368. 'messages' angegeben wird und ein Array mit Schlüssel/Wert Paaren genutzt wird für
  369. das Setzen der Nachrichten Templates. Man muss die Fehlermeldungen der betreffenden
  370. Prüfung für die verschiedenen Fehlertypen von Prüfungen kennen.
  371. </para>
  372. <para>
  373. Eine bessere Option ist es <classname>Zend_Translate_Adapter</classname> in Formular
  374. zu verwenden. Fehlercodes werden automatisch dem Adapter durch den Standardmäßigen
  375. Fehlerdekorator übergeben; man kann durch die Erstellung von Übersetzungen
  376. eigene Fehlermeldungen für die verschiedenen Fehlercodes der Prüfung definieren.
  377. </para>
  378. </note>
  379. <para>
  380. Es können auch viele Prüfungen auf einmal gesetzt werden, indem
  381. <methodname>addValidators()</methodname> verwendet wird. Die grundsätzliche Verwendung
  382. ist es ein Array von Arrays zu übergeben, wobei jedes Array ein bis drei Werte enthält,
  383. die dem Konstruktor von <methodname>addValidator()</methodname> entsprechen:
  384. </para>
  385. <programlisting language="php"><![CDATA[
  386. $element->addValidators(array(
  387. array('NotEmpty', true),
  388. array('alnum'),
  389. array('stringLength', false, array(6, 20)),
  390. ));
  391. ]]></programlisting>
  392. <para>
  393. Wenn man wortreicher oder expliziter sein will, dann können die Arrayschlüssel
  394. 'validator', 'breakChainOnFailure', und 'options' verwendet werden:
  395. </para>
  396. <programlisting language="php"><![CDATA[
  397. $element->addValidators(array(
  398. array(
  399. 'validator' => 'NotEmpty',
  400. 'breakChainOnFailure' => true),
  401. array('validator' => 'alnum'),
  402. array(
  403. 'validator' => 'stringLength',
  404. 'options' => array(6, 20)),
  405. ));
  406. ]]></programlisting>
  407. <para>
  408. Die Verwendung ist gut für die Illustration wie Prüfungen in einer Konfigurationsdatei
  409. definiert werden können:
  410. </para>
  411. <programlisting language="ini"><![CDATA[
  412. element.validators.notempty.validator = "NotEmpty"
  413. element.validators.notempty.breakChainOnFailure = true
  414. element.validators.alnum.validator = "Alnum"
  415. element.validators.strlen.validator = "StringLength"
  416. element.validators.strlen.options.min = 6
  417. element.validators.strlen.options.max = 20
  418. ]]></programlisting>
  419. <para>
  420. Es ist zu beachten, dass jedes Element einen Schlüssel hat, egal ob er benötigt wird
  421. oder nicht; das ist eine Einschränkung bei der Verwendung von Konfigurationsdateien --
  422. aber es macht auch klar, für was die Argumente stehen. Es ist einfach zu beachten das
  423. jede Prüfungsoption in der richtigen Reihenfolge spezifiziert werden muss.
  424. </para>
  425. <para>
  426. Um ein Element zu prüfen, muss der Wert an <methodname>isValid()</methodname> übergeben
  427. werden:
  428. </para>
  429. <programlisting language="php"><![CDATA[
  430. if ($element->isValid($value)) {
  431. // gülig
  432. } else {
  433. // ungültig
  434. }
  435. ]]></programlisting>
  436. <note>
  437. <title>Die Prüfung findet an gefilterten Werte statt</title>
  438. <para>
  439. <methodname>Zend_Form_Element::isValid()</methodname> filtert Werte durch die
  440. angegebene Filterkette vor der Überprüfung. Siehe das
  441. <link linkend="zend.form.elements.filters">Kapitel über Filter</link> für
  442. weitere Informationen.
  443. </para>
  444. </note>
  445. <note>
  446. <title>Prüfungskontext</title>
  447. <para>
  448. <methodname>Zend_Form_Element::isValid()</methodname> unterstützt ein zusätzliches
  449. Argument <varname>$context</varname>. <methodname>Zend_Form::isValid()</methodname>
  450. übergibt ein komplettes Array von Daten die bearbeitet werden an
  451. <varname>$context</varname>, wenn ein Formular geprüft wird und
  452. <methodname>Zend_Form_Element::isValid()</methodname> übergibt es an jede Prüfung.
  453. Das bedeutet, dass man Prüfungen schreiben kann, die auf die Daten die an andere
  454. Formulare übergeben werden acht geben. Als Beispiel nehmen wir ein Anmeldeformular,
  455. welches die Felder für Passwort und Passwort Wiederholung hat; eine Prüfung würde
  456. sein, dass beide Felder den selben Wert beinhalten. So eine Prüfung könnte wie folgt
  457. aussehen:
  458. </para>
  459. <programlisting language="php"><![CDATA[
  460. class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract
  461. {
  462. const NOT_MATCH = 'notMatch';
  463. protected $_messageTemplates = array(
  464. self::NOT_MATCH => 'Die Passwortüberprüfung war nicht erfolgreich'
  465. );
  466. public function isValid($value, $context = null)
  467. {
  468. $value = (string) $value;
  469. $this->_setValue($value);
  470. if (is_array($context)) {
  471. if (isset($context['password_confirm'])
  472. && ($value == $context['password_confirm']))
  473. {
  474. return true;
  475. }
  476. } elseif (is_string($context) && ($value == $context)) {
  477. return true;
  478. }
  479. $this->_error(self::NOT_MATCH);
  480. return false;
  481. }
  482. }
  483. ]]></programlisting>
  484. </note>
  485. <para>
  486. Prüfungen werden in der Reihenfolge ausgeführt. Jede Prüfung wird ausgeführt solange bis
  487. eine Prüfung die mit einem <constant>TRUE</constant> Wert für
  488. <varname>$breakChainOnFailure</varname> bei Ihrer Prüfung fehlschlägt. Man sollte
  489. sichergehen, dass Prüfungen in einer begründeten Reihenfolge definiert werden.
  490. </para>
  491. <para>
  492. Nach einer fehlgeschlagenen Prüfung können Fehlercodes und Nachrichten von der
  493. Prüfkette empfangen werden:
  494. </para>
  495. <programlisting language="php"><![CDATA[
  496. $errors = $element->getErrors();
  497. $messages = $element->getMessages();
  498. ]]></programlisting>
  499. <para>
  500. (Achtung: zurückgegebene Fehlermeldungen sind ein assoziatives Array von
  501. Fehlercode/Fehlermeldung Paaren.)
  502. </para>
  503. <para>
  504. Zusätzlich zu Prüfungen, kann spezifiziert werden, dass ein Element benötigt wird,
  505. indem <methodname>setRequired(true)</methodname> verwendet wird. Standardmäßig ist
  506. dieses Flag <constant>FALSE</constant>, was bedeutet, dass die Prüfkette übersprungen
  507. wird, wenn kein Wert an <methodname>isValid()</methodname> übergeben wird. Dieses
  508. Verhalten kann auf verschiedene Weisen geändert werden:
  509. </para>
  510. <itemizedlist>
  511. <listitem>
  512. <para>
  513. Standardmäßig, wenn ein Element benötigt wird, ist auch ein Flag 'allowEmpty'
  514. <constant>TRUE</constant>. Das bedeutet, dass, wenn ein Wert evaluiert wird,
  515. der leer ist, und an <methodname>isValid()</methodname> übergeben wird, die
  516. Prüfung übersprungen wird. Dieses Flag kann gewechselt werden mit Hilfe der
  517. Zugriffsmethode <methodname>setAllowEmpty($flag)</methodname>; Wenn das Flag
  518. <constant>FALSE</constant> ist, und ein Wert übergeben wird, werden die
  519. Prüfungen trotzdem durchlaufen.
  520. </para>
  521. </listitem>
  522. <listitem>
  523. <para>
  524. Standardmäßig, wenn ein Element benötigt wird, es aber keine 'NotEmpty'
  525. Prüfung hat, wird <methodname>isValid()</methodname> eine an oberster Stelle im
  526. Stack platzieren, mit gesetztem <varname>$breakChainOnFailure</varname> Flag.
  527. Das heißt, dass das Flag folgende semantische Bedeutung bekommt: Wenn kein Wert
  528. übergeben wird, wird die Übertragung sofort ungülig und der Benutzer wird
  529. informiert, was die anderen Prüfungen davon abhält, ausgeführt zu werden, auf
  530. Daten, von denen wir bereits wissen, dass sie ungültig sind.
  531. </para>
  532. <para>
  533. Wenn dieses Verhalten nicht gewünscht ist kann es durch die Übergabe eines
  534. <constant>FALSE</constant> Wert an
  535. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname> ausgeschaltet
  536. werden; das verhindert, dass <methodname>isValid()</methodname> die 'NotEmpty'
  537. Prüfung in der Prüfkette platziert.
  538. </para>
  539. </listitem>
  540. </itemizedlist>
  541. <para>
  542. Für weitere Informationen über Prüfungen kann in die
  543. <link linkend="zend.validate.introduction">Zend_Validate Dokumentation</link>
  544. gesehen werden.
  545. </para>
  546. <note>
  547. <title>Verwenden von Zend_Form_Elements als generell-eingesetzte Prüfung</title>
  548. <para>
  549. <classname>Zend_Form_Element</classname> implementiert
  550. <classname>Zend_Validate_Interface</classname> was bedeutet das ein Element auch als
  551. Prüfung füreinander verwendet werden kann, bezüglich nicht-Formular Prüfketten.
  552. </para>
  553. </note>
  554. <note>
  555. <title>Wann wird ein Element als leer erkannt?</title>
  556. <para>
  557. Wie erwähnt wird der 'NotEmpty' Prüfer verwendet um zu erkennen ob ein Element leer
  558. ist oder nicht. Aber <classname>Zend_Validate_NotEmpty</classname> arbeitet
  559. standardmäßig nicht wie <acronym>PHP</acronym>'s <methodname>empty()</methodname>
  560. Methode.
  561. </para>
  562. <para>
  563. Das bedeutet, wenn ein Element ein Integer <emphasis>0</emphasis> oder einen
  564. <emphasis>'0'</emphasis> String enthält dann wird dieses Element als nicht leer
  565. engesehen. Wenn man ein anderes Verhalten will, muss man seine eigene Instanz von
  566. <classname>Zend_Validate_NotEmpty</classname> erstellen. Dort kann man das Verhalten
  567. dieser Prüfung definieren. Siehe <ulink
  568. url="zend.validate.set.notempty">Zend_Validate_NotEmpty</ulink> für Details.
  569. </para>
  570. </note>
  571. <para>
  572. Die mit der Prüfung assoziierten Methoden sind:
  573. </para>
  574. <itemizedlist>
  575. <listitem>
  576. <para>
  577. <methodname>setRequired($flag)</methodname> und
  578. <methodname>isRequired()</methodname> erlauben es den Status des 'required'
  579. Flag zu setzen und zu empfangen. Wenn der Wert auf <constant>TRUE</constant>
  580. gesetzt wird, erzwingt dieses Flag, dass das Element, in den Daten die von
  581. <classname>Zend_Form</classname> bearbeitet werden, vorhanden ist.
  582. </para>
  583. </listitem>
  584. <listitem>
  585. <para>
  586. <methodname>setAllowEmpty($flag)</methodname> und
  587. <methodname>getAllowEmpty()</methodname> erlauben es das Verhalten von
  588. optionalen Elementen (z.B. Elementen in denen das 'required' Flag
  589. <constant>FALSE</constant> ist) zu ändern. Wenn das 'allowEmpty' Flag
  590. <constant>TRUE</constant> ist, werden leere Werte nicht an die Prüfkette
  591. übergeben.
  592. </para>
  593. </listitem>
  594. <listitem>
  595. <para>
  596. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname> erlaubt es zu
  597. definieren ob eine 'NotEmpty' Prüfung der Prüfkette vorangestellt wird wenn das
  598. Element benötigt wird. Standardmäßig ist dieses Flag <constant>TRUE</constant>.
  599. </para>
  600. </listitem>
  601. <listitem>
  602. <para>
  603. <methodname>addValidator($nameOrValidator, $breakChainOnFailure = false, array
  604. $options = null)</methodname>
  605. </para>
  606. </listitem>
  607. <listitem>
  608. <para><methodname>addValidators(array $validators)</methodname></para>
  609. </listitem>
  610. <listitem>
  611. <para>
  612. <methodname>setValidators(array $validators)</methodname> (Überschreibt alle
  613. Prüfer)
  614. </para>
  615. </listitem>
  616. <listitem>
  617. <para>
  618. <methodname>getValidator($name)</methodname> (Empfängt ein Prüfobjekt durch
  619. seinen Namen)
  620. </para>
  621. </listitem>
  622. <listitem>
  623. <para><methodname>getValidators()</methodname> (Empfängt alle Prüfer)</para>
  624. </listitem>
  625. <listitem>
  626. <para>
  627. <methodname>removeValidator($name)</methodname> (Entfernt einen Prüfer durch
  628. seinen Namen)
  629. </para>
  630. </listitem>
  631. <listitem>
  632. <para><methodname>clearValidators()</methodname> (Entfernt alle Prüfer)</para>
  633. </listitem>
  634. </itemizedlist>
  635. <sect3 id="zend.form.elements.validators.errors">
  636. <title>Eigene Fehlermeldungen</title>
  637. <para>
  638. Von Zeit zu Zeit ist es gewünscht ein oder mehrere spezielle Fehlermeldungen zu
  639. spezifizieren, die statt der Fehlermeldungen verwendet werden sollen, die von den
  640. Validatoren verwendet werden, die dem Element angehängt sind. Zusätzlich will man
  641. von Zeit zu Zeit ein Element selbst als ungültig markieren. Ab Version 1.6.0 des
  642. Zend Frameworks ist diese Funktionalität über die folgenden Methoden möglich.
  643. </para>
  644. <itemizedlist>
  645. <listitem>
  646. <para>
  647. <methodname>addErrorMessage($message)</methodname>: Fügt eine Fehlermeldung
  648. hinzu, die bei Formular-Überprüfungs-Fehlern angezeigt wird. Sie kann mehr
  649. als einmal aufgerufen werden, und neue Meldungen werden dem Stack angehängt.
  650. </para>
  651. </listitem>
  652. <listitem>
  653. <para>
  654. <methodname>addErrorMessages(array $messages)</methodname>: Fügt mehrere
  655. Fehlermeldungen hinzu, die bei Formular-Überprüfungs-Fehlern angezeigt
  656. werden.
  657. </para>
  658. </listitem>
  659. <listitem>
  660. <para>
  661. <methodname>setErrorMessages(array $messages)</methodname>: Fügt mehrere
  662. Fehlermeldungen hinzu, die bei Formular-Überprüfungs-Fehlern angezeigt
  663. werden, und überschreibt alle vorher gesetzten Fehlermeldungen.
  664. </para>
  665. </listitem>
  666. <listitem>
  667. <para>
  668. <methodname>getErrorMessages()</methodname>: Empfängt eine Liste von
  669. selbstdefinierten Fehlermeldungen, die vorher definiert wurden.
  670. </para>
  671. </listitem>
  672. <listitem>
  673. <para>
  674. <methodname>clearErrorMessages()</methodname>: Entfernt alle eigenen
  675. Fehlermeldungen, die vorher definiert wurden.
  676. </para>
  677. </listitem>
  678. <listitem>
  679. <para>
  680. <methodname>markAsError()</methodname>: Markiert das Element, wie, wenn die
  681. Überprüfung fehlgeschlagen wäre.
  682. </para>
  683. </listitem>
  684. <listitem>
  685. <para>
  686. <methodname>hasErrors()</methodname>: Erkennt, ob ein Element eine
  687. Überprüfung nicht bestanden hat oder, ob es als ungültig markiert wurde.
  688. </para>
  689. </listitem>
  690. <listitem>
  691. <para>
  692. <methodname>addError($message)</methodname>: Fügt einen Fehler zum eigenen
  693. Stack der Fehlermeldungen hinzu und markiert das Element als ungültig.
  694. </para>
  695. </listitem>
  696. <listitem>
  697. <para>
  698. <methodname>addErrors(array $messages)</methodname>: Fügt mehrere
  699. Nachrichten zum eigenen Stack der Fehlermeldungen hinzu und markiert das
  700. Element als ungültig.
  701. </para>
  702. </listitem>
  703. <listitem>
  704. <para>
  705. <methodname>setErrors(array $messages)</methodname>: Überschreibt den
  706. eigenen Stack der Fehlermeldungen mit den angegebenen Meldungen und markiert
  707. das Element als ungültig.
  708. </para>
  709. </listitem>
  710. </itemizedlist>
  711. <para>
  712. Alle Fehler die auf diesem Weg gesetzt werden, können übersetzt werden. Zusätzlich
  713. kann der Platzhalter "%value%" eingefügt werden um den Wert des Elements zu
  714. repräsentieren; dieser aktuelle Wert des Element wird eingefügt wenn die
  715. Fehlermeldung empfangen wird.
  716. </para>
  717. </sect3>
  718. </sect2>
  719. <sect2 id="zend.form.elements.decorators">
  720. <title>Dekoratoren</title>
  721. <para>
  722. Ein möglicher Schmerzpunkt für viele Webentwickler, ist die Erstellung von
  723. <acronym>XHTML</acronym> Formularen selbst. Für jedes Element muss der Entwickler das
  724. Markup für das Element selbst erstellen, typischerweise ein Label und, wenn sie nett zu
  725. den Benutzern sind, das Markup für die Anzeige von Fehlermeldungen von Prüfungen. Je
  726. mehr Elemente auf einer Seite sind, desto weniger trivial wird diese Aufgabe.
  727. </para>
  728. <para>
  729. <classname>Zend_Form_Element</classname> versucht dieses Problem durch die Verwendung
  730. von "Dekoratoren" zu lösen. Dekoratoren sind Klassen die Zugriff auf das Element
  731. haben und eine Methode zur Darstellung des Inhalts bieten. Für weitere Informationen
  732. darüber wie Dekoratoren arbeiten, kann im Kapitel über
  733. <link linkend="zend.form.decorators">Zend_Form_Decorator</link> eingesehen werden.
  734. </para>
  735. <para>
  736. Die von <classname>Zend_Form_Element</classname> verwendeten Standarddekoratoren sind:
  737. </para>
  738. <itemizedlist>
  739. <listitem>
  740. <para>
  741. <emphasis>ViewHelper</emphasis>: Spezifiziert einen View Helfer der verwendet
  742. wird, um das Element darzustellen. Das 'helper' Attribut des Elements kann
  743. verwendet werden, um zu spezifizieren welcher View Helfer verwendet werden soll.
  744. Standardmäßig spezifiziert <classname>Zend_Form_Element</classname> den
  745. 'formText' View Helfer, aber individuelle Unterklassen spezifizieren
  746. unterschiedliche Helfer.
  747. </para>
  748. </listitem>
  749. <listitem>
  750. <para>
  751. <emphasis>Errors</emphasis>: Fügt Fehlermeldungen an das Element an, indem es
  752. <classname>Zend_View_Helper_FormErrors</classname> verwendet. Wenn keine
  753. vorhanden sind, wird nichts hinzugefügt.
  754. </para>
  755. </listitem>
  756. <listitem>
  757. <para>
  758. <emphasis>Description</emphasis>: Fügt dem Element eine Beschreibung hinzu. Wenn
  759. keine vorhanden ist, wird nichts angehängt. Standardmäßig wird die Beschreibung
  760. in einem &lt;p&gt; Tag dargestellt mit einer CSS Klasse namens 'description'.
  761. </para>
  762. </listitem>
  763. <listitem>
  764. <para>
  765. <emphasis>HtmlTag</emphasis>: Umschliesst das Element und Fehler in einem
  766. <acronym>HTML</acronym> &lt;dd&gt; Tag.
  767. </para>
  768. </listitem>
  769. <listitem>
  770. <para>
  771. <emphasis>Label</emphasis>: Stellt ein Label vor das Element, indem es
  772. <classname>Zend_View_Helper_FormLabel</classname> verwendet, und umschliesst es
  773. in einem &lt;dt&gt; Tag. Wenn kein Label angegeben wurde, wird nur das
  774. &lt;dt&gt; Tag dargestellt.
  775. </para>
  776. </listitem>
  777. </itemizedlist>
  778. <note>
  779. <title>Standard Dekoratoren müssen nicht geladen werden</title>
  780. <para>
  781. Standardmäßig werden die Standarddekoratoren während der Initialisierung des Objekts
  782. geladen. Das kann durch die Übergabe der 'disableLoadDefaultDecorators' Option an
  783. den Konstruktor ausgeschaltet werden:
  784. </para>
  785. <programlisting language="php"><![CDATA[
  786. $element = new Zend_Form_Element('foo',
  787. array('disableLoadDefaultDecorators' =>
  788. true)
  789. );
  790. ]]></programlisting>
  791. <para>
  792. Diese Option kann mit jeder anderen Option gemischt werden die übergeben wird,
  793. sowohl als Array Option oder in einem <classname>Zend_Config</classname> Objekt.
  794. </para>
  795. </note>
  796. <para>
  797. Da die Reihenfolge, in der die Dekoratoren registriert werden, von Bedeutung ist -- der
  798. zuerst registrierte Dekorator wird als erstes ausgeführt -- muss man sicherstellen, dass
  799. eigene Dekoratoren in der richtigen Reihenfolge registriert werden, oder sicherstellen,
  800. dass die Platzierungs-Optionen in einem ausgewogenen Weg gesetzt werden. Um ein Beispiel
  801. zu geben, ist hier ein Code der den Standarddekorator registriert:
  802. </para>
  803. <programlisting language="php"><![CDATA[
  804. $this->addDecorators(array(
  805. array('ViewHelper'),
  806. array('Errors'),
  807. array('Description', array('tag' => 'p', 'class' => 'description')),
  808. array('HtmlTag', array('tag' => 'dd')),
  809. array('Label', array('tag' => 'dt')),
  810. ));
  811. ]]></programlisting>
  812. <para>
  813. Der anfängliche Inhalt wird vom 'ViewHelper' Dekorator erstellt, welche das Formular
  814. Element selbst erstellt. Als nächstes fängt der 'Errors' Dekorator Fehlermeldungen vom
  815. Element und, wenn welche vorhanden sind, übergibt er sie an den 'FormErrors' View Helfer
  816. zur Darstellung. Wenn eine Beschreibung vorhanden ist, wird der 'Description' Dekorator
  817. einen Paragraph der Klasse 'description' anhängen, der den beschreibenden Text für den
  818. betreffenden Inhalt enthält. Der nächste Dekorator, 'HtmlTag', umschliesst das Element
  819. und die Fehler in ein <acronym>HTML</acronym> &lt;dd&gt; Tag. Letztendlich, empfängt der
  820. letzte Dekorator, 'label' das Label des Elements und übergibt es an den 'FormLabel' View
  821. Helfer, und umschliesst es in einen <acronym>HTML</acronym> &lt;dt&gt; Tag; der Wert
  822. wird dem Inhalt standardmäßig vorangestellt. Die resultierende Ausgabe sieht
  823. grundsätzlich wie folgt aus:
  824. </para>
  825. <programlisting language="html"><![CDATA[
  826. <dt><label for="foo" class="optional">Foo</label></dt>
  827. <dd>
  828. <input type="text" name="foo" id="foo" value="123" />
  829. <ul class="errors">
  830. <li>"123" ist kein alphanumerischer Wert</li>
  831. </ul>
  832. <p class="description">
  833. Das ist etwas beschreibender Text betreffend dem Element.
  834. </p>
  835. </dd>
  836. ]]></programlisting>
  837. <para>
  838. Für weitere Informationen über Dekoratoren gibt es das
  839. <link linkend="zend.form.decorators">Kapitel über Zend_Form_Decorator</link>.
  840. </para>
  841. <note>
  842. <title>Mehrere Dekoratoren des gleichen Typs verwenden</title>
  843. <para>
  844. Intern verwendet <classname>Zend_Form_Element</classname> eine Dekoratorklasse als
  845. Mechanismus für das Nachschauen wenn Dekoratore empfangen werden. Als Ergebnis,
  846. können mehrere Dekratoren nicht zur gleichen Zeit registriert werden; nachgeordnete
  847. Dekoratoren überschreiben jene, die vorher existiert haben.
  848. </para>
  849. <para>
  850. Um das zu umgehen, können <emphasis>Aliase</emphasis> verwendet werden. Statt der
  851. Übergabe eines Dekorators oder Dekoratornamens als erstes Argument an
  852. <methodname>addDecorator()</methodname>, kann ein Array mit einem einzelnen Element
  853. übergeben werden, mit dem Alias der auf das Dekoratorobjekt oder -namen zeigt:
  854. </para>
  855. <programlisting language="php"><![CDATA[
  856. // Alias zu 'FooBar':
  857. $element->addDecorator(array('FooBar' => 'HtmlTag'),
  858. array('tag' => 'div'));
  859. // Und es später erhalten:
  860. $decorator = $element->getDecorator('FooBar');
  861. ]]></programlisting>
  862. <para>
  863. In den <methodname>addDecorators()</methodname> und
  864. <methodname>setDecorators()</methodname> Methoden muss die 'decorator' Option im
  865. Array übergeben werden, welche den Dekorator repräsentiert:
  866. </para>
  867. <programlisting language="php"><![CDATA[
  868. // Zwei 'HtmlTag' Dekoratore hinzufügen, einen Alias auf 'FooBar' setzen:
  869. $element->addDecorators(
  870. array('HtmlTag', array('tag' => 'div')),
  871. array(
  872. 'decorator' => array('FooBar' => 'HtmlTag'),
  873. 'options' => array('tag' => 'dd')
  874. ),
  875. );
  876. // Und sie später empfangen:
  877. $htmlTag = $element->getDecorator('HtmlTag');
  878. $fooBar = $element->getDecorator('FooBar');
  879. ]]></programlisting>
  880. </note>
  881. <para>
  882. Die folgenden Methoden sind mit Dekoratoren assoziiert:
  883. </para>
  884. <itemizedlist>
  885. <listitem>
  886. <para>
  887. <methodname>addDecorator($nameOrDecorator, array $options = null)</methodname>
  888. </para>
  889. </listitem>
  890. <listitem>
  891. <para>
  892. <methodname>addDecorators(array $decorators)</methodname>
  893. </para>
  894. </listitem>
  895. <listitem>
  896. <para>
  897. <methodname>setDecorators(array $decorators)</methodname> (Überschreibt alle
  898. Dekoratoren)
  899. </para>
  900. </listitem>
  901. <listitem>
  902. <para>
  903. <methodname>getDecorator($name)</methodname> (Empfängt ein Dekoratorobjekt durch
  904. seinen Namen)
  905. </para>
  906. </listitem>
  907. <listitem>
  908. <para>
  909. <methodname>getDecorators()</methodname> (Empfängt alle Dekoratoren)
  910. </para>
  911. </listitem>
  912. <listitem>
  913. <para>
  914. <methodname>removeDecorator($name)</methodname> (Entfernt einen Dekorator durch
  915. seinen Namen)
  916. </para>
  917. </listitem>
  918. <listitem>
  919. <para>
  920. <methodname>clearDecorators()</methodname> (Entfernt alle Dekoratoren)
  921. </para>
  922. </listitem>
  923. </itemizedlist>
  924. <para>
  925. <classname>Zend_Form_Element</classname> verwendet auch Überladung um die Darstellung
  926. von speziellen Dekoratoren zu erlauben. <methodname>__call()</methodname> interagiert
  927. mit Methoden auf mit dem Text 'render' anfangen und verwendet den Rest des
  928. Methodennamens dazu um nach einen Dekorator zu suchen; wenn er gefunden wird, wird er
  929. diesen <emphasis>einzelnen</emphasis> Dekorator darstellen. Jedes Argument das dem
  930. Methodenaufruf übergeben wird, wird als Inhalt für die Übergabe an die
  931. <methodname>render()</methodname> Methode des Dekorators verwendet. Als Beispiel:
  932. </para>
  933. <programlisting language="php"><![CDATA[
  934. // Stellt nur den ViewHelper Dekorator dar:
  935. echo $element->renderViewHelper();
  936. // Nur den HtmlTag Dekorator darstellen, und Inhalt übergeben:
  937. echo $element->renderHtmlTag("Das ist der Inhalt des HTML Tags");
  938. ]]></programlisting>
  939. <para>
  940. Wenn der Dekorator nicht existiert, wird eine Exception geworfen.
  941. </para>
  942. </sect2>
  943. <sect2 id="zend.form.elements.metadata">
  944. <title>Metadaten und Attribute</title>
  945. <para>
  946. <classname>Zend_Form_Element</classname> behandelt eine Vielzahl von Attributen und
  947. Metadaten des Elements. Basisattribute sind:
  948. </para>
  949. <itemizedlist>
  950. <listitem>
  951. <para>
  952. <emphasis>name</emphasis>: Der Name des Elements. Verwendet die Zugriffsmethoden
  953. <methodname>setName()</methodname> und <methodname>getName()</methodname>.
  954. </para>
  955. </listitem>
  956. <listitem>
  957. <para>
  958. <emphasis>label</emphasis>: Das Label des Elements. Verwendet die
  959. Zugriffsmethoden <methodname>setLabel()</methodname> und
  960. <methodname>getLabel()</methodname>.
  961. </para>
  962. </listitem>
  963. <listitem>
  964. <para>
  965. <emphasis>order</emphasis>: Der Index bei dem ein Element im Formular erscheinen
  966. soll. Verwendet die Zugriffsmethoden <methodname>setOrder()</methodname> und
  967. <methodname>getOrder()</methodname>.
  968. </para>
  969. </listitem>
  970. <listitem>
  971. <para>
  972. <emphasis>value</emphasis>: Der aktuelle Wert des Elements. Verwendet die
  973. Zugriffsmethoden <methodname>setValue()</methodname> und
  974. <methodname>getValue()</methodname>.
  975. </para>
  976. </listitem>
  977. <listitem>
  978. <para>
  979. <emphasis>description</emphasis>: Eine Beschreibung des Elements; wird oft
  980. verwendet um Tooltips oder Javascript mäßige Hinweise anzubieten die den Zweck
  981. des Elements beschreiben. Verwendet die Zugriffsmethoden
  982. <methodname>setDescription()</methodname> und
  983. <methodname>getDescription()</methodname>.
  984. </para>
  985. </listitem>
  986. <listitem>
  987. <para>
  988. <emphasis>required</emphasis>: Ein Flag, das anzeigt ob ein Element benötigt
  989. wird wenn eine Prüfung des Formulars durchgeführt wird, oder nicht. Verwendet
  990. die Zugriffsmethoden <methodname>setRequired()</methodname> und
  991. <methodname>getRequired()</methodname>. Dieses Flag ist standardmäßig
  992. <constant>FALSE</constant>.
  993. </para>
  994. </listitem>
  995. <listitem>
  996. <para>
  997. <emphasis>allowEmpty</emphasis>: Ein Flag, das indiziert ob ein nicht benötigtes
  998. (optionales) Element versuchen soll leere Werte zu prüfen. Wenn es
  999. <constant>TRUE</constant> ist, und das 'required' Flag
  1000. <constant>FALSE</constant>, dann werden leere Werte nicht an die Prüfkette
  1001. übergeben, und es wird <constant>TRUE</constant> angenommen. Verwendet die
  1002. Zugriffsmethoden <methodname>setAllowEmpty()</methodname> und
  1003. <methodname>getAllowEmpty()</methodname>. Dieses Flag ist standardmäßig
  1004. <constant>TRUE</constant>.
  1005. </para>
  1006. </listitem>
  1007. <listitem>
  1008. <para>
  1009. <emphasis>autoInsertNotEmptyValidator</emphasis>: Ein Flag, das indiziert, ob
  1010. eine 'NotEmpty' Prüfung eingefügt werden soll, wenn das Element benötigt wird,
  1011. oder nicht. Standardmäßig ist dieses Flag <constant>TRUE</constant>. Das Flag
  1012. kann mit <methodname>setAutoInsertNotEmptyValidator($flag)</methodname> gesetzt
  1013. und der Wert mit <methodname>autoInsertNotEmptyValidator()</methodname>
  1014. ermittelt werden.
  1015. </para>
  1016. </listitem>
  1017. </itemizedlist>
  1018. <para>
  1019. Formular Elemente können zusätzliche Metadaten benötigen. Für <acronym>XHTML</acronym>
  1020. Form Elemente zum Beispiel, kann es gewünscht sein, Attribute wie die Klasse oder die Id
  1021. zu spezifizieren. Für die Durchführung gibt es ein Set von Zugriffsmethoden:
  1022. </para>
  1023. <itemizedlist>
  1024. <listitem>
  1025. <para>
  1026. <emphasis>setAttrib($name, $value)</emphasis>: Fügt ein Attribut hinzu
  1027. </para>
  1028. </listitem>
  1029. <listitem>
  1030. <para>
  1031. <emphasis>setAttribs(array $attribs)</emphasis>: Wie addAttribs(), aber
  1032. überschreibend
  1033. </para>
  1034. </listitem>
  1035. <listitem>
  1036. <para>
  1037. <emphasis>getAttrib($name)</emphasis>: Empfägt einen einzelnen Attributwert
  1038. </para>
  1039. </listitem>
  1040. <listitem>
  1041. <para>
  1042. <emphasis>getAttribs()</emphasis>: Empfängt alle Attribute als Schlüssel/Wert
  1043. Paare
  1044. </para>
  1045. </listitem>
  1046. </itemizedlist>
  1047. <para>
  1048. Die meiste Zeit kann auf sie, trotzdem, einfach als Objekteigenschaften zugegriffen
  1049. werden, da <classname>Zend_Form_Element</classname> das Überladen realisiert und den
  1050. Zugriff zu ihnen erlaubt:
  1051. </para>
  1052. <programlisting language="php"><![CDATA[
  1053. // Gleichbedeutend mit $element->setAttrib('class', 'text'):
  1054. $element->class = 'text;
  1055. ]]></programlisting>
  1056. <para>
  1057. Standardmäßig werden alle Attribute, die an den View Helfer übergeben werden, auch vom
  1058. Element während der Darstellung verwendet, und als <acronym>HTML</acronym> Attribute des
  1059. Element Tags dargestellt.
  1060. </para>
  1061. </sect2>
  1062. <sect2 id="zend.form.elements.standard">
  1063. <title>Standard Elemente</title>
  1064. <para>
  1065. <classname>Zend_Form</classname> wird mit einer Anzahl an Standardelementen
  1066. ausgeliefert; lesen Sie das Kapitel über
  1067. <link linkend="zend.form.standardElements">Standard Elemente</link> für vollständige
  1068. Details.
  1069. </para>
  1070. </sect2>
  1071. <sect2 id="zend.form.elements.methods">
  1072. <title>Zend_Form_Element Methoden</title>
  1073. <para>
  1074. <classname>Zend_Form_Element</classname> hat viele, viele Methoden. Was folgt, ist eine
  1075. kurze Zusammenfassung ihrer Signatur - gruppiert nach Typ:
  1076. </para>
  1077. <itemizedlist>
  1078. <listitem>
  1079. <para>Konfiguration:</para>
  1080. <itemizedlist>
  1081. <listitem>
  1082. <para><methodname>setOptions(array $options)</methodname></para>
  1083. </listitem>
  1084. <listitem>
  1085. <para><methodname>setConfig(Zend_Config $config)</methodname></para>
  1086. </listitem>
  1087. </itemizedlist>
  1088. </listitem>
  1089. <listitem>
  1090. <para>I18n:</para>
  1091. <itemizedlist>
  1092. <listitem>
  1093. <para>
  1094. <methodname>setTranslator(Zend_Translate_Adapter $translator =
  1095. null)</methodname>
  1096. </para>
  1097. </listitem>
  1098. <listitem><para><methodname>getTranslator()</methodname></para></listitem>
  1099. <listitem>
  1100. <para><methodname>setDisableTranslator($flag)</methodname></para>
  1101. </listitem>
  1102. <listitem>
  1103. <para><methodname>translatorIsDisabled()</methodname></para>
  1104. </listitem>
  1105. </itemizedlist>
  1106. </listitem>
  1107. <listitem>
  1108. <para>Eigenschaften:</para>
  1109. <itemizedlist>
  1110. <listitem><para><methodname>setName($name)</methodname></para></listitem>
  1111. <listitem><para><methodname>getName()</methodname></para></listitem>
  1112. <listitem><para><methodname>setValue($value)</methodname></para></listitem>
  1113. <listitem><para><methodname>getValue()</methodname></para></listitem>
  1114. <listitem><para><methodname>getUnfilteredValue()</methodname></para></listitem>
  1115. <listitem><para><methodname>setLabel($label)</methodname></para></listitem>
  1116. <listitem><para><methodname>getLabel()</methodname></para></listitem>
  1117. <listitem>
  1118. <para><methodname>setDescription($description)</methodname></para>
  1119. </listitem>
  1120. <listitem><para><methodname>getDescription()</methodname></para></listitem>
  1121. <listitem><para><methodname>setOrder($order)</methodname></para></listitem>
  1122. <listitem><para><methodname>getOrder()</methodname></para></listitem>
  1123. <listitem><para><methodname>setRequired($flag)</methodname></para></listitem>
  1124. <listitem><para><methodname>getRequired()</methodname></para></listitem>
  1125. <listitem><para><methodname>setAllowEmpty($flag)</methodname></para></listitem>
  1126. <listitem><para><methodname>getAllowEmpty()</methodname></para></listitem>
  1127. <listitem>
  1128. <para>
  1129. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  1130. </para>
  1131. </listitem>
  1132. <listitem>
  1133. <para><methodname>autoInsertNotEmptyValidator()</methodname></para>
  1134. </listitem>
  1135. <listitem><para><methodname>setIgnore($flag)</methodname></para></listitem>
  1136. <listitem><para><methodname>getIgnore()</methodname></para></listitem>
  1137. <listitem><para><methodname>getType()</methodname></para></listitem>
  1138. <listitem>
  1139. <para><methodname>setAttrib($name, $value)</methodname></para>
  1140. </listitem>
  1141. <listitem>
  1142. <para><methodname>setAttribs(array $attribs)</methodname></para>
  1143. </listitem>
  1144. <listitem><para><methodname>getAttrib($name)</methodname></para></listitem>
  1145. <listitem><para><methodname>getAttribs()</methodname></para></listitem>
  1146. </itemizedlist>
  1147. </listitem>
  1148. <listitem>
  1149. <para>Plugin Loader und Pfade:</para>
  1150. <itemizedlist>
  1151. <listitem>
  1152. <para>
  1153. <methodname>setPluginLoader(Zend_Loader_PluginLoader_Interface $loader,
  1154. $type)</methodname>
  1155. </para>
  1156. </listitem>
  1157. <listitem>
  1158. <para><methodname>getPluginLoader($type)</methodname></para>
  1159. </listitem>
  1160. <listitem>
  1161. <para>
  1162. <methodname>addPrefixPath($prefix, $path, $type = null)</methodname>
  1163. </para>
  1164. </listitem>
  1165. <listitem>
  1166. <para><methodname>addPrefixPaths(array $spec)</methodname></para>
  1167. </listitem>
  1168. </itemizedlist>
  1169. </listitem>
  1170. <listitem>
  1171. <para>Prüfung:</para>
  1172. <itemizedlist>
  1173. <listitem>
  1174. <para>
  1175. <methodname>addValidator($validator, $breakChainOnFailure = false,
  1176. $options = array())</methodname>
  1177. </para>
  1178. </listitem>
  1179. <listitem>
  1180. <para><methodname>addValidators(array $validators)</methodname></para>
  1181. </listitem>
  1182. <listitem>
  1183. <para><methodname>setValidators(array $validators)</methodname></para>
  1184. </listitem>
  1185. <listitem><para><methodname>getValidator($name)</methodname></para></listitem>
  1186. <listitem><para><methodname>getValidators()</methodname></para></listitem>
  1187. <listitem>
  1188. <para><methodname>removeValidator($name)</methodname></para>
  1189. </listitem>
  1190. <listitem><para><methodname>clearValidators()</methodname></para></listitem>
  1191. <listitem>
  1192. <para><methodname>isValid($value, $context = null)</methodname></para>
  1193. </listitem>
  1194. <listitem><para><methodname>getErrors()</methodname></para></listitem>
  1195. <listitem><para><methodname>getMessages()</methodname></para></listitem>
  1196. </itemizedlist>
  1197. </listitem>
  1198. <listitem>
  1199. <para>Filter:</para>
  1200. <itemizedlist>
  1201. <listitem>
  1202. <para>
  1203. <methodname>addFilter($filter, $options = array())</methodname>
  1204. </para>
  1205. </listitem>
  1206. <listitem>
  1207. <para><methodname>addFilters(array $filters)</methodname></para>
  1208. </listitem>
  1209. <listitem>
  1210. <para><methodname>setFilters(array $filters)</methodname></para>
  1211. </listitem>
  1212. <listitem><para><methodname>getFilter($name)</methodname></para></listitem>
  1213. <listitem><para><methodname>getFilters()</methodname></para></listitem>
  1214. <listitem><para><methodname>removeFilter($name)</methodname></para></listitem>
  1215. <listitem><para><methodname>clearFilters()</methodname></para></listitem>
  1216. </itemizedlist>
  1217. </listitem>
  1218. <listitem>
  1219. <para>Darstellung:</para>
  1220. <itemizedlist>
  1221. <listitem>
  1222. <para>
  1223. <methodname>setView(Zend_View_Interface $view = null)</methodname>
  1224. </para>
  1225. </listitem>
  1226. <listitem><para><methodname>getView()</methodname></para></listitem>
  1227. <listitem>
  1228. <para>
  1229. <methodname>addDecorator($decorator, $options = null)</methodname>
  1230. </para>
  1231. </listitem>
  1232. <listitem>
  1233. <para><methodname>addDecorators(array $decorators)</methodname></para>
  1234. </listitem>
  1235. <listitem>
  1236. <para><methodname>setDecorators(array $decorators)</methodname></para>
  1237. </listitem>
  1238. <listitem><para><methodname>getDecorator($name)</methodname></para></listitem>
  1239. <listitem><para><methodname>getDecorators()</methodname></para></listitem>
  1240. <listitem>
  1241. <para><methodname>removeDecorator($name)</methodname></para>
  1242. </listitem>
  1243. <listitem><para><methodname>clearDecorators()</methodname></para></listitem>
  1244. <listitem>
  1245. <para>
  1246. <methodname>render(Zend_View_Interface $view = null)</methodname>
  1247. </para>
  1248. </listitem>
  1249. </itemizedlist>
  1250. </listitem>
  1251. </itemizedlist>
  1252. </sect2>
  1253. <sect2 id="zend.form.elements.config">
  1254. <title>Konfiguration</title>
  1255. <para>
  1256. Der Konstruktor von <classname>Zend_Form_Element</classname> akzeptiert entweder einen
  1257. Array von Optionen oder ein <classname>Zend_Config</classname> Objekt das Optionen
  1258. enthält, und es kann auch durch Verwendung von <methodname>setOptions()</methodname>
  1259. oder <methodname>setConfig()</methodname> konfiguriert werden. Generell, werden die
  1260. Schlüssel wie folgt benannt:
  1261. </para>
  1262. <itemizedlist>
  1263. <listitem>
  1264. <para>
  1265. Wenn 'set' + Schlüssel auf eine <classname>Zend_Form_Element</classname> Methode
  1266. zeigt, dann wird der angebotene Wert zu dieser Methode übermittelt.
  1267. </para>
  1268. </listitem>
  1269. <listitem>
  1270. <para>Andernfalls wird der Wert verwendet um ein Attribut zu setzen.</para>
  1271. </listitem>
  1272. </itemizedlist>
  1273. <para>
  1274. Ausnahmen zu dieser Regel sind die folgenden:
  1275. </para>
  1276. <itemizedlist>
  1277. <listitem>
  1278. <para>
  1279. <property>prefixPath</property> wird an
  1280. <methodname>addPrefixPaths()</methodname> übergeben
  1281. </para>
  1282. </listitem>
  1283. <listitem>
  1284. <para>
  1285. Die folgenden Setzer können nicht auf diesem Weg gesetzt werden:
  1286. </para>
  1287. <itemizedlist>
  1288. <listitem>
  1289. <para>
  1290. <property>setAttrib</property> (über <property>setAttribs</property>
  1291. <emphasis>wird</emphasis> es funktionieren)
  1292. </para>
  1293. </listitem>
  1294. <listitem><para><property>setConfig</property></para></listitem>
  1295. <listitem><para><property>setOptions</property></para></listitem>
  1296. <listitem><para><property>setPluginLoader</property></para></listitem>
  1297. <listitem><para><property>setTranslator</property></para></listitem>
  1298. <listitem><para><property>setView</property></para></listitem>
  1299. </itemizedlist>
  1300. </listitem>
  1301. </itemizedlist>
  1302. <para>
  1303. Als Beispiel ist hier eine Konfigurationsdatei die eine Konfiguration für jeden
  1304. Typ von konfigurierbaren Daten übergibt:
  1305. </para>
  1306. <programlisting language="ini"><![CDATA[
  1307. [element]
  1308. name = "foo"
  1309. value = "foobar"
  1310. label = "Foo:"
  1311. order = 10
  1312. required = true
  1313. allowEmpty = false
  1314. autoInsertNotEmptyValidator = true
  1315. description = "Foo Elemente sind für Beispiele"
  1316. ignore = false
  1317. attribs.id = "foo"
  1318. attribs.class = "element"
  1319. ; Setzt das 'onclick' Attribut
  1320. onclick = "autoComplete(this, '/form/autocomplete/element')"
  1321. prefixPaths.decorator.prefix = "My_Decorator"
  1322. prefixPaths.decorator.path = "My/Decorator/"
  1323. disableTranslator = 0
  1324. validators.required.validator = "NotEmpty"
  1325. validators.required.breakChainOnFailure = true
  1326. validators.alpha.validator = "alpha"
  1327. validators.regex.validator = "regex"
  1328. validators.regex.options.pattern = "/^[A-F].*/$"
  1329. filters.ucase.filter = "StringToUpper"
  1330. decorators.element.decorator = "ViewHelper"
  1331. decorators.element.options.helper = "FormText"
  1332. decorators.label.decorator = "Label"
  1333. ]]></programlisting>
  1334. </sect2>
  1335. <sect2 id="zend.form.elements.custom">
  1336. <title>Eigene Elemente</title>
  1337. <para>
  1338. Es können eigene Elemente durch die Erweiterung der
  1339. <classname>Zend_Form_Element</classname> Klasse erstellt werden. Übliche Gründe hierfür
  1340. sind:
  1341. </para>
  1342. <itemizedlist>
  1343. <listitem>
  1344. <para>Elemente, die eine gemeinsame Prüfung und/oder Filter teilen</para>
  1345. </listitem>
  1346. <listitem>
  1347. <para>Elemente die eine eigene Dekoratoren Funktionalität haben</para>
  1348. </listitem>
  1349. </itemizedlist>
  1350. <para>
  1351. Es gibt zwei Methoden die typischerweise verwendet werden, um ein Element zu erweitern:
  1352. <methodname>init()</methodname>, was verwendet werden kannm um eine eigene
  1353. Initialisierungs-Logik zum Element hinzuzufügen, und
  1354. <methodname>loadDefaultDecorators()</methodname>, was verwendet werden kann um eine
  1355. Liste von Standard Dekoratoren zu setzen, die vom Element verwendet werden sollen.
  1356. </para>
  1357. <para>
  1358. Als Beispiel nehmen wir an, dass alle Text Elemente eines Formulars die erstellt werden
  1359. mit <classname>StringTrim</classname> gefiltert werden müssen, mit einem gemeinsamen
  1360. Regulären Ausdruck und das ein eigener Dekorator 'My_Decorator_TextItem' verwendet
  1361. werden soll, der für die Darstellung von ihnen erstellt wurde; zusätzlich gibt es eine
  1362. Anzahl an Standardattributen, wie 'size', 'maxLength', und 'class', die spezifiziert
  1363. werden sollen. So ein Element könnte wie folgt definiert werden:
  1364. </para>
  1365. <programlisting language="php"><![CDATA[
  1366. class My_Element_Text extends Zend_Form_Element
  1367. {
  1368. public function init()
  1369. {
  1370. $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator')
  1371. ->addFilters('StringTrim')
  1372. ->addValidator('Regex', false, array('/^[a-z0-9]{6,}$/i'))
  1373. ->addDecorator('TextItem')
  1374. ->setAttrib('size', 30)
  1375. ->setAttrib('maxLength', 45)
  1376. ->setAttrib('class', 'text');
  1377. }
  1378. }
  1379. ]]></programlisting>
  1380. <para>
  1381. Man könnte dann das Formular Objekt über den Präfix Pfad für diese Elemente informieren,
  1382. und die Erstellung der Elemente beginnen:
  1383. </para>
  1384. <programlisting language="php"><![CDATA[
  1385. $form->addPrefixPath('My_Element', 'My/Element/', 'element')
  1386. ->addElement('text', 'foo');
  1387. ]]></programlisting>
  1388. <para>
  1389. Das 'foo' Element wird vom Typ <classname>My_Element_Text</classname> sein, und dem
  1390. beschriebenen Verhalten entsprechen.
  1391. </para>
  1392. <para>
  1393. Eine andere Methode, die man überschreiben sollte, wenn
  1394. <classname>Zend_Form_Element</classname> erweitert wird, ist die
  1395. <methodname>loadDefaultDecorators()</methodname> Methode. Diese Methode lädt fallweise
  1396. ein Set von Standarddekoratoren für das Element; es kann gewünscht sein, eigene
  1397. Dekoratoren in der erweiterten Klasse zu verwenden:
  1398. </para>
  1399. <programlisting language="php"><![CDATA[
  1400. class My_Element_Text extends Zend_Form_Element
  1401. {
  1402. public function loadDefaultDecorators()
  1403. {
  1404. $this->addDecorator('ViewHelper')
  1405. ->addDecorator('DisplayError')
  1406. ->addDecorator('Label')
  1407. ->addDecorator('HtmlTag',
  1408. array('tag' => 'div', 'class' => 'element'));
  1409. }
  1410. }
  1411. ]]></programlisting>
  1412. <para>
  1413. Es gibt viele Wege, Elemente anzupassen; man sollte sicherstellen die
  1414. <acronym>API</acronym> Dokumentation von <classname>Zend_Form_Element</classname> zu
  1415. lesen um alle vorhandenen Methoden zu kennen.
  1416. </para>
  1417. </sect2>
  1418. </sect1>