Zend_Form-Elements.xml 60 KB

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