Zend_Form-Forms.xml 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926
  1. <sect1 id="zend.form.forms">
  2. <title>Creando formularios usando Zend_Form</title>
  3. <para>
  4. La clase <code>Zend_Form</code> es usada para agregar elementos de
  5. formulario, desplegar grupos y subformularios. Éstos pueden ejecutar las
  6. siguientes acciones en estos elementos:
  7. </para>
  8. <itemizedlist>
  9. <listitem><para>
  10. Validación, incluyendo la recuperación de código y mensajes de error
  11. </para></listitem>
  12. <listitem><para>
  13. Agregación de valor, incluyendo el llenado de elementos y recuperación
  14. de valores tanto filtrados como no filtrados para todos los elementos
  15. </para></listitem>
  16. <listitem><para>
  17. Iteración sobre todos los elementos, en el orden en el cual han sido
  18. introducidos o basados en el orden recuperado de cada elemento
  19. </para></listitem>
  20. <listitem><para>
  21. Generando el formulario entero, ya sea por un simple decorador que
  22. ejecuta un muestreo personalizado o por iteración sobre cada
  23. elemento del formulario
  24. </para></listitem>
  25. </itemizedlist>
  26. <para>
  27. Mientras los formularios creados con <code>Zend_Form</code> pueden ser
  28. complejos, probablemente su mejor uso es para formularios simples; es
  29. mejor utilizarlo para desarrollar aplicaciones rápidas y de prototipado.
  30. </para>
  31. <para>
  32. En lo más básico, simplemente instancie el objeto formulario:
  33. </para>
  34. <programlisting role="php"><![CDATA[
  35. // Objeto form genérico:
  36. $form = new Zend_Form();
  37. // Objeto form personalizado:
  38. $form = new My_Form()
  39. ]]>
  40. </programlisting>
  41. <para>
  42. Opcionalmente puede pasarlo en la configuración, la cual será usada para
  43. establecer el estado del objeto, potencialmente así como también crear
  44. nuevos elementos:
  45. </para>
  46. <programlisting role="php"><![CDATA[
  47. // Pasando opciones en la configuración:
  48. $form = new Zend_Form($config);
  49. ]]>
  50. </programlisting>
  51. <para>
  52. <code>Zend_Form</code> es iterable, e iterará sobre elementos, grupos que
  53. mostrar y subformularios, usando el orden en el cual han sido registrados
  54. y en cualquier índice de orden que cada uno pueda tener. Esto es útil
  55. en casos donde desee generar los elementos manualmente en el orden apropiado.
  56. </para>
  57. <para>
  58. La magia de <code>Zend_Form</code> radica en la habilidad para servir como
  59. fábrica para elementos y grupos, así como también la habilidad de generarse
  60. a sí mismo a través de decoradores.
  61. </para>
  62. <sect2 id="zend.form.forms.plugins">
  63. <title>Cargadores de Plugin</title>
  64. <para>
  65. <code>Zend_Form</code> hace uso de
  66. <code>Zend_Loader_PluginLoader</code> para permitir a los
  67. desarroladores especificar la ubicación de elementos y decoradores
  68. alternativos. Cada uno tiene su propio plugin loader asociado, y
  69. métodos de acceso genéricos son usados para recuperar y modificar
  70. cada uno.
  71. </para>
  72. <para>
  73. Los siguientes tipos de cargadores son usados con los variados métodos
  74. del plugin loader: 'element' y 'decorator'. Los nombres de los tipos
  75. no distinguen mayúsculas de minúsculas.
  76. </para>
  77. <para>
  78. Los métodos usados para interactuar con plugin loaders son los siguientes:
  79. </para>
  80. <itemizedlist>
  81. <listitem><para>
  82. <code>setPluginLoader($loader, $type)</code>: $loader es el propio
  83. objeto plugin loader, mientras $type es uno de los tipos
  84. especificados arriba. Esto establece el plugin loader para el
  85. tipo dado al objeto loader recién especificado.
  86. </para></listitem>
  87. <listitem><para>
  88. <code>getPluginLoader($type)</code>: recupera el plugin loader
  89. asociado con $type.
  90. </para></listitem>
  91. <listitem><para>
  92. <code>addPrefixPath($prefix, $path, $type = null)</code>: agrega
  93. una asociación prefijo/ruta al loader especificado por $type. Si
  94. $type es nulo, intentará añadir una ruta a todos los loaders,
  95. añadiendo el prefijo "_Element" y "_Decorator"; y añadiendo la
  96. ruta con "Element/" y "Decorator/". Si tiene todas sus clases
  97. form element extras bajo una jerarquía común, éste es un método
  98. coveniente para establecer el prefijo de base para ellas.
  99. </para></listitem>
  100. <listitem><para>
  101. <code>addPrefixPaths(array $spec)</code>: le permite añadir varias
  102. rutas en uno o mas plugin loaders. Se espera que cada elemento
  103. del array sea un array con las claves 'path', 'prefix' y 'type'.
  104. </para></listitem>
  105. </itemizedlist>
  106. <para>
  107. Adicionalmente, puede especificar prefijos de rutas para todos los
  108. elementos y mostrar grupos creados a través de una instancia de
  109. <code>Zend_Form</code> usando los siguientes métodos:
  110. </para>
  111. <itemizedlist>
  112. <listitem><para>
  113. <code>addElementPrefixPath($prefix, $path, $type = null)</code>:
  114. Igual que <code>addPrefixPath()</code>, debe especificar un
  115. prefijo y ruta de clase. <code>$type</code>, cuando se especifica,
  116. tiene que ser uno de los tipos plugin loader especificados por
  117. <code>Zend_Form_Element</code>; vea la <link
  118. linkend="zend.form.elements.loaders">sección elemento plugins
  119. </link> para más información de valores válidos para
  120. <code>$type</code>. Si <code>$type</code> no es especificado, el
  121. método asumirá que es un prefijo general para todos los tipos.
  122. </para></listitem>
  123. <listitem><para>
  124. <code>addDisplayGroupPrefixPath($prefix, $path)</code>:
  125. Igual que <code>addPrefixPath()</code>, debe especificar un
  126. prefijo y ruta de clase; sin embargo, dado que los grupos de visualización (display groups)
  127. sólo soportan decoradores como plugins, <code>$type</code> no es
  128. necesario.
  129. </para></listitem>
  130. </itemizedlist>
  131. <para>
  132. Elementos y decoradores personalizados son una manera fácil de compartir
  133. funcionalidad entre formularios y encapsular funcionalidad personalizada.
  134. Vea el <link
  135. linkend="zend.form.elements.loaders.customLabel">ejemplo de Etiqueta
  136. Personalizada</link> en la documentación de elementos para un
  137. ejemplo de cómo elementos personalizados pueden ser usados como
  138. reemplazos para clases estándar.
  139. </para>
  140. </sect2>
  141. <sect2 id="zend.form.forms.elements">
  142. <title>Elementos</title>
  143. <para>
  144. <code>Zend_Form</code> proporciona varios métodos de acceso para añadir
  145. y eliminar elementos de el formulario. Éstos pueden tomar instancias
  146. de objetos de elemento o servir como fábricas para instanciar el
  147. objeto elemento a sí mismo.
  148. </para>
  149. <para>
  150. El método más básico para añadir un elemento es
  151. <code>addElement()</code>. Este método puede tomar también un objeto
  152. de tipo <code>Zend_Form_Element</code> (o de una clase extendiendo
  153. <code>Zend_Form_Element</code>), o argumentos para construir un nuevo
  154. elemento -- incluyendo el elemento tipo, nombre y algunas opciones de
  155. configuración.
  156. </para>
  157. <para>
  158. Como algunos ejemplos:
  159. </para>
  160. <programlisting role="php"><![CDATA[
  161. // Usando un elemento instanciado:
  162. $element = new Zend_Form_Element_Text('foo');
  163. $form->addElement($element);
  164. // Usando una fábrica
  165. //
  166. // Crea un elemento de tipo Zend_Form_Element_Text con el
  167. // nombre de 'foo':
  168. $form->addElement('text', 'foo');
  169. // Pasa una opción etiqueta al elemento:
  170. $form->addElement('text', 'foo', array('label' => 'Foo:'));
  171. ]]>
  172. </programlisting>
  173. <note>
  174. <title>addElement() Implementa una Interfaz Fluida</title>
  175. <para>
  176. <code>addElement()</code> implementa una interfaz fluida; es
  177. decir, retorna el objeto <code>Zend_Form</code> y no un
  178. elemento. Esto se ha hecho para permitirle encadenar
  179. multiples métodos addElement() u otros métodos formulario que
  180. implementen una interfaz fluida (todos los establecedores en Zend_Form
  181. implementan el patrón).
  182. </para>
  183. <para>
  184. Si desea retornar el elemento, use
  185. <code>createElement()</code>, el cual es esbozado abajo. Tenga en cuenta
  186. de cualquier manera que <code>createElement()</code> no adjunta el
  187. elemento al formulario.
  188. </para>
  189. <para>
  190. Internamente, <code>addElement()</code> en realidad emplea
  191. <code>createElement()</code> para crear el elemento antes de
  192. adjuntarlo al formulario.
  193. </para>
  194. </note>
  195. <para>
  196. Una vez que el elemento ha sido añadido al formulario, puede recuperarlo por
  197. el nombre. Puede también finalizar usando el método <code>getElement()</code>
  198. o usando sobrecarga para acceder al elemento como una propiedad de
  199. objeto:
  200. </para>
  201. <programlisting role="php"><![CDATA[
  202. // getElement():
  203. $foo = $form->getElement('foo');
  204. // Como propiedad del objeto:
  205. $foo = $form->foo;
  206. ]]>
  207. </programlisting>
  208. <para>
  209. Ocasionalmente, se quiere crear un elemento sin adjuntarlo
  210. al formulario (para instanciar, si se desea hacer uso de las
  211. rutas de plugin introducidas con el formulario, pero después se desea adjuntar el
  212. objeto al subformulario). El método <code>createElement()</code>
  213. permite hacer eso:
  214. </para>
  215. <programlisting role="php"><![CDATA[
  216. // $username llega a ser un objeto Zend_Form_Element_Text:
  217. $username = $form->createElement('text', 'username');
  218. ]]>
  219. </programlisting>
  220. <sect3 id="zend.form.forms.elements.values">
  221. <title>Llenar y recuperar valores</title>
  222. <para>
  223. Después de validar el formulario, originalmente se necesitará recuperar los
  224. valores para poder ejecutar otras operaciones, tal como actualizar una
  225. base de datos o notificar un servicio web. Se pueden recuperar todos los valores
  226. para todos los elementos usando <code>getValues()</code>;
  227. <code>getValue($name)</code> le permite recuperar un solo
  228. valor del elemento por su nombre:
  229. </para>
  230. <programlisting role="php"><![CDATA[
  231. // Obtener todos los valores:
  232. $values = $form->getValues();
  233. // Obtener sólo los valores del elemento 'foo':
  234. $value = $form->getValue('foo');
  235. ]]>
  236. </programlisting>
  237. <para>
  238. A veces se quiere llenar el formulario con valores especificos
  239. antes de generarlos. Éstos pueden ser llevados a cabo ya sea con los
  240. métodos <code>setDefaults()</code> o <code>populate()</code>:
  241. </para>
  242. <programlisting role="php"><![CDATA[
  243. $form->setDefaults($data);
  244. $form->populate($data);
  245. ]]>
  246. </programlisting>
  247. <para>
  248. Por otro lado, si se quisera limpiar el formulario antes de llenarlo
  249. o validarlo; se puede realizar usando el
  250. método <code>reset()</code>:
  251. </para>
  252. <programlisting role="php"><![CDATA[
  253. $form->reset();
  254. ]]>
  255. </programlisting>
  256. </sect3>
  257. <sect3 id="zend.form.forms.elements.global">
  258. <title>Operaciones Globales</title>
  259. <para>
  260. Ocasionalemnte se necesitarán ciertas operaciones que afecten a todos
  261. los elementos. Escenarios comunes incluyen la necesidad de determinar rutas de acceso
  262. al prefijo complemento para todos los elementos, determinando decoradores para todos los elementos y
  263. determinando filtros para todos los elementos. Como ejemplos:
  264. </para>
  265. <example id="zend.form.forms.elements.global.allpaths">
  266. <title>Determinando rutas de acceso de prefijos para todos los elementos</title>
  267. <para>
  268. Se puede determinar rutas de acceso para prefijos para todos los elementos por tipo,
  269. o usando un prefijo global. Como ejemplos:
  270. </para>
  271. <programlisting role="php"><![CDATA[
  272. // Determinar la ruta de acceso de prefijos global
  273. // Crear rutas de acceso para los prefijos My_Foo_Filter, My_Foo_Validate,
  274. // y My_Foo_Decorator
  275. $form->addElementPrefixPath('My_Foo', 'My/Foo/');
  276. // Sólo rutas de acceso de filtros:
  277. $form->addElementPrefixPath('My_Foo_Filter',
  278. 'My/Foo/Filter',
  279. 'filter');
  280. // Sólo rutas de acceso de validadores:
  281. $form->addElementPrefixPath('My_Foo_Validate',
  282. 'My/Foo/Validate',
  283. 'validate');
  284. // Sólo rutas de acceso de decoradores:
  285. $form->addElementPrefixPath('My_Foo_Decorator',
  286. 'My/Foo/Decorator',
  287. 'decorator');
  288. ]]>
  289. </programlisting>
  290. </example>
  291. <example id="zend.form.forms.elements.global.decorators">
  292. <title>Determinando Decoradores para todos los elementos</title>
  293. <para>
  294. Se pueden determinar decoradores para todos los elementos.
  295. <code>setElementDecorators()</code> acepta una matriz de
  296. decoradores, solo como <code>setDecorators()</code>, y
  297. reescribirá cualquier decorador previamente determinado en cada elemento. En
  298. este ejemplo, determinamos los decoradores para simplificar una ViewHelper
  299. y una Label:
  300. </para>
  301. <programlisting role="php"><![CDATA[
  302. $form->setElementDecorators(array(
  303. 'ViewHelper',
  304. 'Label'
  305. ));
  306. ]]>
  307. </programlisting>
  308. </example>
  309. <example id="zend.form.forms.elements.global.decoratorsFilter">
  310. <title>Determinando decoradores para algunos elementos</title>
  311. <para>
  312. Pueden determinarse también decoradores para un subconjunto de elementos,
  313. ya sea por inclusión o exclusión. El segundo argumento
  314. <code>setElementDecorators()</code> puede ser un array de
  315. nombres de elemento; por defecto, especificar un array de ese tipo
  316. determinará los decoradores especificados en esos elementos solamente. Puede
  317. tambien pasar un tercer elemento, una bandera indicando si
  318. esta lista de elementos es para propósitos de inclusión o exclusión;
  319. si es falso, decorará todos los elementos
  320. <emphasis>excepto</emphasis> los pasados en la lista,
  321. Como uso estándar del método, cualquier decorador pasado
  322. reescribirá cualquier decorador previamente determinado en cada
  323. elemento.
  324. </para>
  325. <para>
  326. En el siguiente fragmento, indicamos que queremos los decoradores
  327. ViewHelper y Label para los elementos
  328. 'foo' y 'bar':
  329. </para>
  330. <programlisting role="php"><![CDATA[
  331. $form->setElementDecorators(
  332. array(
  333. 'ViewHelper',
  334. 'Label'
  335. ),
  336. array(
  337. 'foo',
  338. 'bar'
  339. )
  340. );
  341. ]]>
  342. </programlisting>
  343. <para>
  344. Por otro lado, con este fragmento, indicaremos
  345. que queremos usar solamente los decoradores
  346. ViewHelper y Label para cada elemento <emphasis>excepto</emphasis>
  347. los elementos 'foo' y 'bar':
  348. </para>
  349. <programlisting role="php"><![CDATA[
  350. $form->setElementDecorators(
  351. array(
  352. 'ViewHelper',
  353. 'Label'
  354. ),
  355. array(
  356. 'foo',
  357. 'bar'
  358. ),
  359. false
  360. );
  361. ]]>
  362. </programlisting>
  363. </example>
  364. <note>
  365. <title>Algunos Decoradores son Inapropiados para algunos Elementos</title>
  366. <para>
  367. Mientras <code>setElementDecorators()</code> puede parecer
  368. una buena solución, existen algunos casos donde puede
  369. terminar con resultados inesperados, Por ejemplo,
  370. los muchos elementos botones (Submit, Button, Reset),
  371. actualmente usan la etiqueta como el valor del botón
  372. y sólo usan los decoradores ViewHelper y DtDdWrapper --
  373. previniendo una etiqueta adicional, errores, y sugerencias de
  374. ser generadas; el ejemplo de arriba podría duplicar algún
  375. contenido (la etiqueta).
  376. </para>
  377. <para>
  378. Se puede usar el array de inclusión/exclusión para superar
  379. este problema como se ha notado en el ejemplo anterior.
  380. </para>
  381. <para>
  382. Entonces, use este método sabiamente y dése cuenta de que puede
  383. necesitar excluir o cambiar manualmente algunos elementos decoradores
  384. para prevenir una salida no deseada.
  385. </para>
  386. </note>
  387. <example id="zend.form.forms.elements.global.filters">
  388. <title>Determinando Filtros para todos los Elementos</title>
  389. <para>
  390. En muchos casos, puede quererse aplicar el mismo filtro a todos
  391. los elementos; un caso común es <code>trim()</code> a todos los valores:
  392. </para>
  393. <programlisting role="php"><![CDATA[
  394. $form->setElementFilters(array('StringTrim'));
  395. ]]>
  396. </programlisting>
  397. </example>
  398. </sect3>
  399. <sect3 id="zend.form.forms.elements.methods">
  400. <title>Métodos para Interactuar con los Elementos</title>
  401. <para>
  402. Los siguientes métodos pueden ser usados para interactuar con los elementos:
  403. </para>
  404. <itemizedlist>
  405. <listitem><para>
  406. <code>createElement($element, $name = null, $options = null)</code>
  407. </para></listitem>
  408. <listitem><para>
  409. <code>addElement($element, $name = null, $options = null)</code>
  410. </para></listitem>
  411. <listitem><para>
  412. <code>addElements(array $elements)</code>
  413. </para></listitem>
  414. <listitem><para>
  415. <code>setElements(array $elements)</code>
  416. </para></listitem>
  417. <listitem><para>
  418. <code>getElement($name)</code>
  419. </para></listitem>
  420. <listitem><para>
  421. <code>getElements()</code>
  422. </para></listitem>
  423. <listitem><para>
  424. <code>removeElement($name)</code>
  425. </para></listitem>
  426. <listitem><para>
  427. <code>clearElements()</code>
  428. </para></listitem>
  429. <listitem><para>
  430. <code>setDefaults(array $defaults)</code>
  431. </para></listitem>
  432. <listitem><para>
  433. <code>setDefault($name, $value)</code>
  434. </para></listitem>
  435. <listitem><para>
  436. <code>getValue($name)</code>
  437. </para></listitem>
  438. <listitem><para>
  439. <code>getValues()</code>
  440. </para></listitem>
  441. <listitem><para>
  442. <code>getUnfilteredValue($name)</code>
  443. </para></listitem>
  444. <listitem><para>
  445. <code>getUnfilteredValues()</code>
  446. </para></listitem>
  447. <listitem><para>
  448. <code>setElementFilters(array $filters)</code>
  449. </para></listitem>
  450. <listitem><para>
  451. <code>setElementDecorators(array $decorators)</code>
  452. </para></listitem>
  453. <listitem><para>
  454. <code>addElementPrefixPath($prefix, $path, $type = null)</code>
  455. </para></listitem>
  456. <listitem><para>
  457. <code>addElementPrefixPaths(array $spec)</code>
  458. </para></listitem>
  459. </itemizedlist>
  460. </sect3>
  461. </sect2>
  462. <sect2 id="zend.form.forms.displaygroups">
  463. <title>Grupos de visualización (display groups)</title>
  464. <para>
  465. Los grupos de visualización (display groups) son una manera de crear grupos virtuales de elementos para
  466. propósitos de visualización. Todos los elementos quedan accesibles por nombre en el
  467. formulario, pero cuando interactúan o se ejecutan sobre el formulario, cualquiera de los elementos en
  468. un grupos de visualización son generados juntos. El caso más común de uso es
  469. agrupando los elementos en fieldsets. (TODO)
  470. </para>
  471. <para>
  472. La clase base para los grupos de visualización es
  473. <code>Zend_Form_DisplayGroup</code>. Mientras puede ser instanciado
  474. directamente, es mejor usar el método <code>addDisplayGroup()</code>
  475. de la clase<code>Zend_Form</code>. Este método toma un
  476. array de elementos como primer argumento y el nombre para el grupo de
  477. visualización como segundo argumento. Opcionalmente, se puede pasar en una array
  478. de opciones o en un objeto <code>Zend_Config</code> como tercer argumento.
  479. </para>
  480. <para>
  481. Asumiendo que los elementos 'username' y 'password' has sido determinados
  482. en el formulario, el siguiente código podría agrupar estos elementos en un
  483. grupo de visualización 'login':
  484. </para>
  485. <programlisting role="php"><![CDATA[
  486. $form->addDisplayGroup(array('username', 'password'), 'login');
  487. ]]>
  488. </programlisting>
  489. <para>
  490. Puede acceder a los grupos de visualización usando el
  491. método <code>getDisplayGroup()</code>, o mediante la sobrecarga usando el
  492. nombre del grupo de visualización:
  493. </para>
  494. <programlisting role="php"><![CDATA[
  495. // Usando getDisplayGroup():
  496. $login = $form->getDisplayGroup('login');
  497. // Usando sobrecarga:
  498. $login = $form->login;
  499. ]]>
  500. </programlisting>
  501. <note>
  502. <title>Decoradores por defecto que no necesitan ser cargados</title>
  503. <para>
  504. Por defecto, los grupos de visualización son cargados durante la
  505. inicialización del objeto. Se puede deshabilitar pasando la
  506. opción 'disableLoadDefaultDecorators' cuando se crea un grupo de visualización:
  507. </para>
  508. <programlisting role="php"><![CDATA[
  509. $form->addDisplayGroup(
  510. array('foo', 'bar'),
  511. 'foobar',
  512. array('disableLoadDefaultDecorators' => true)
  513. );
  514. ]]>
  515. </programlisting>
  516. <para>
  517. Esta opción puede ser una mezcla con otras opciones pasadas,
  518. ambas como opciones de array o en el objeto <code>Zend_Config</code>
  519. </para>
  520. </note>
  521. <sect3 id="zend.form.forms.displaygroups.global">
  522. <title>Operaciones Globales</title>
  523. <para>
  524. Al igual que los elementos, existen algunas operaciones que
  525. pueden afectar a todos los grupos de visualización; éstas incluyen determinar decoradores
  526. y fijar la ruta de acceso donde buscar los decoradores.
  527. </para>
  528. <example id="zend.form.forms.displaygroups.global.paths">
  529. <title>Fijando el Prefijo de Ruta del Decorador para todos los Grupos de Visualización</title>
  530. <para>
  531. Por defecto, los grupos de visualización heredan cualquier
  532. ruta de decorador que use el formulario; sin embargo, si deberían buscar
  533. en una ruta alternativa, puede usar el método
  534. <code>addDisplayGroupPrefixPath()</code> method.
  535. </para>
  536. <programlisting role="php"><![CDATA[
  537. $form->addDisplayGroupPrefixPath('My_Foo_Decorator', 'My/Foo/Decorator');
  538. ]]>
  539. </programlisting>
  540. </example>
  541. <example id="zend.form.forms.displaygroups.global.decorators">
  542. <title>Fijando Decoradores para Todos los Grupos de Visualización</title>
  543. <para>
  544. Pueden determinarse decoradores para todos los grupos de visualización,
  545. <code>setDisplayGroupDecorators()</code> admite un array de
  546. decoradores, al igual que <code>setDecorators()</code>, y sobreescribirá
  547. cualquier conjunto de decoradores previo en cada grupo de visualización.
  548. En este ejemplo, fijamos los decoradores a un fieldset (el decorador FormElements
  549. es necesario para asegurar que los elementos son iterador):
  550. </para>
  551. <programlisting role="php"><![CDATA[
  552. $form->setDisplayGroupDecorators(array(
  553. 'FormElements',
  554. 'Fieldset'
  555. ));
  556. ]]>
  557. </programlisting>
  558. </example>
  559. </sect3>
  560. <sect3 id="zend.form.forms.displaygroups.customClasses">
  561. <title>Usando Clases de Grupos de Visualización Personalizadas</title>
  562. <para>
  563. Por defecto, <code>Zend_Form</code> utiliza la clase
  564. <code>Zend_Form_DisplayGroup</code> para grupos de visualización.
  565. Puede ocurrir que necesite extender esta clase con el fin
  566. de obtener una funcionalid personalizada. <code>addDisplayGroup()</code>
  567. no permite pasar una instancia determinada, pero permite especificar
  568. la clase que usar como una de sus opciones, usando la clave
  569. 'displayGroupClass':
  570. </para>
  571. <programlisting role="php"><![CDATA[
  572. // Use the 'My_DisplayGroup' class
  573. $form->addDisplayGroup(
  574. array('username', 'password'),
  575. 'user',
  576. array('displayGroupClass' => 'My_DisplayGroup')
  577. );
  578. ]]>
  579. </programlisting>
  580. <para>
  581. Si la clase no ha sido todavía cargada, <code>Zend_Form</code>
  582. intentará cargarla a través de <code>Zend_Loader</code>.
  583. </para>
  584. <para>
  585. También puede especificar una clase de grupo de visualización por defecto
  586. para usar con el formulario, de forma que todos los grupos de visualización
  587. creados con el objeto formulario usen esa clase:
  588. </para>
  589. <programlisting role="php"><![CDATA[
  590. // Use the 'My_DisplayGroup' class for all display groups:
  591. $form->setDefaultDisplayGroupClass('My_DisplayGroup');
  592. ]]>
  593. </programlisting>
  594. <para>
  595. Esta funcionalidad puede especificarse en configuraciones como
  596. 'defaultDisplayGroupClass', y será cargada con antelación para
  597. asegurar que todos los grupos de visualización usen esa clase.
  598. </para>
  599. </sect3>
  600. <sect3 id="zend.form.forms.displaygroups.interactionmethods">
  601. <title>Métodos para Interactuar con Grupos de Visualización</title>
  602. <para>
  603. Los siguientes métodos pueden ser usados para interactuar con el grupo de visualización:
  604. </para>
  605. <itemizedlist>
  606. <listitem><para>
  607. <code>addDisplayGroup(array $elements, $name, $options = null)</code>
  608. </para></listitem>
  609. <listitem><para>
  610. <code>addDisplayGroups(array $groups)</code>
  611. </para></listitem>
  612. <listitem><para>
  613. <code>setDisplayGroups(array $groups)</code>
  614. </para></listitem>
  615. <listitem><para>
  616. <code>getDisplayGroup($name)</code>
  617. </para></listitem>
  618. <listitem><para>
  619. <code>getDisplayGroups()</code>
  620. </para></listitem>
  621. <listitem><para>
  622. <code>removeDisplayGroup($name)</code>
  623. </para></listitem>
  624. <listitem><para>
  625. <code>clearDisplayGroups()</code>
  626. </para></listitem>
  627. <listitem><para>
  628. <code>setDisplayGroupDecorators(array $decorators)</code>
  629. </para></listitem>
  630. <listitem><para>
  631. <code>addDisplayGroupPrefixPath($prefix, $path)</code>
  632. </para></listitem>
  633. <listitem><para>
  634. <code>setDefaultDisplayGroupClass($class)</code>
  635. </para></listitem>
  636. <listitem><para>
  637. <code>getDefaultDisplayGroupClass($class)</code>
  638. </para></listitem>
  639. </itemizedlist>
  640. </sect3>
  641. <sect3 id="zend.form.forms.displaygroups.methods">
  642. <title>Métodos Zend_Form_DisplayGroup</title>
  643. <para>
  644. <code>Zend_Form_DisplayGroup</code> tiene los siguientes métodos,
  645. agrupados por tipo:
  646. </para>
  647. <itemizedlist>
  648. <listitem><para>Configuración:</para>
  649. <itemizedlist>
  650. <listitem><para><code>setOptions(array $options)</code></para></listitem>
  651. <listitem><para><code>setConfig(Zend_Config $config)</code></para></listitem>
  652. </itemizedlist>
  653. </listitem>
  654. <listitem><para>Metadatos:</para>
  655. <itemizedlist>
  656. <listitem><para><code>setAttrib($key, $value)</code></para></listitem>
  657. <listitem><para><code>addAttribs(array $attribs)</code></para></listitem>
  658. <listitem><para><code>setAttribs(array $attribs)</code></para></listitem>
  659. <listitem><para><code>getAttrib($key)</code></para></listitem>
  660. <listitem><para><code>getAttribs()</code></para></listitem>
  661. <listitem><para><code>removeAttrib($key)</code></para></listitem>
  662. <listitem><para><code>clearAttribs()</code></para></listitem>
  663. <listitem><para><code>setName($name)</code></para></listitem>
  664. <listitem><para><code>getName()</code></para></listitem>
  665. <listitem><para><code>setDescription($value)</code></para></listitem>
  666. <listitem><para><code>getDescription()</code></para></listitem>
  667. <listitem><para><code>setLegend($legend)</code></para></listitem>
  668. <listitem><para><code>getLegend()</code></para></listitem>
  669. <listitem><para><code>setOrder($order)</code></para></listitem>
  670. <listitem><para><code>getOrder()</code></para></listitem>
  671. </itemizedlist>
  672. </listitem>
  673. <listitem><para>Elementos:</para>
  674. <itemizedlist>
  675. <listitem><para><code>createElement($type, $name, array $options = array())</code></para></listitem>
  676. <listitem><para><code>addElement($typeOrElement, $name, array $options = array())</code></para></listitem>
  677. <listitem><para><code>addElements(array $elements)</code></para></listitem>
  678. <listitem><para><code>setElements(array $elements)</code></para></listitem>
  679. <listitem><para><code>getElement($name)</code></para></listitem>
  680. <listitem><para><code>getElements()</code></para></listitem>
  681. <listitem><para><code>removeElement($name)</code></para></listitem>
  682. <listitem><para><code>clearElements()</code></para></listitem>
  683. </itemizedlist>
  684. </listitem>
  685. <listitem><para>Cargadores Complemento:</para>
  686. <itemizedlist>
  687. <listitem><para><code>setPluginLoader(Zend_Loader_PluginLoader $loader)</code></para></listitem>
  688. <listitem><para><code>getPluginLoader()</code></para></listitem>
  689. <listitem><para><code>addPrefixPath($prefix, $path)</code></para></listitem>
  690. <listitem><para><code>addPrefixPaths(array $spec)</code></para></listitem>
  691. </itemizedlist>
  692. </listitem>
  693. <listitem><para>Decoratores:</para>
  694. <itemizedlist>
  695. <listitem><para><code>addDecorator($decorator, $options = null)</code></para></listitem>
  696. <listitem><para><code>addDecorators(array $decorators)</code></para></listitem>
  697. <listitem><para><code>setDecorators(array $decorators)</code></para></listitem>
  698. <listitem><para><code>getDecorator($name)</code></para></listitem>
  699. <listitem><para><code>getDecorators()</code></para></listitem>
  700. <listitem><para><code>removeDecorator($name)</code></para></listitem>
  701. <listitem><para><code>clearDecorators()</code></para></listitem>
  702. </itemizedlist>
  703. </listitem>
  704. <listitem><para>Generadores:</para>
  705. <itemizedlist>
  706. <listitem><para><code>setView(Zend_View_Interface $view = null)</code></para></listitem>
  707. <listitem><para><code>getView()</code></para></listitem>
  708. <listitem><para><code>render(Zend_View_Interface $view = null)</code></para></listitem>
  709. </itemizedlist>
  710. </listitem>
  711. <listitem><para>I18n:</para>
  712. <itemizedlist>
  713. <listitem><para><code>setTranslator(Zend_Translate_Adapter $translator = null)</code></para></listitem>
  714. <listitem><para><code>getTranslator()</code></para></listitem>
  715. <listitem><para><code>setDisableTranslator($flag)</code></para></listitem>
  716. <listitem><para><code>translatorIsDisabled()</code></para></listitem>
  717. </itemizedlist>
  718. </listitem>
  719. </itemizedlist>
  720. </sect3>
  721. </sect2>
  722. <sect2 id="zend.form.forms.subforms">
  723. <title>Subformularios</title>
  724. <para>
  725. Los Sub formularios sirven para diferentes propósitos:
  726. </para>
  727. <itemizedlist>
  728. <listitem><para>
  729. Crear grupos de elementos lógicos. Dado que los sub formularios son
  730. simplemente formularios, se pueden validar subformularios como entidades individuales.
  731. </para></listitem>
  732. <listitem><para>
  733. Crear formularios multi-páginas. Dado que los sub formularios son simplemente formularios,
  734. se puede deplegar un sub formulario por separado por página, incrementando formularios
  735. multi-páginas donde cada formulario tiene su propia validación lógica. Solo una vez
  736. que todos los sub formularios se validen, el formulario se consideraría completo.
  737. </para></listitem>
  738. <listitem><para>
  739. Agrupaciones de visualización. Como grupos de visualización, los sub formularios, cuando son generados
  740. como parte de un formulario más grande, pueden ser usados para agrupar elementos. Sea consciente,
  741. de todas maneras, que el objeto formulario principal no tendrá
  742. conocimiento de los elementos en un sub formulario.
  743. </para></listitem>
  744. </itemizedlist>
  745. <para>
  746. Un sub formulario puede ser un objeto <code>Zend_Form</code> o mas
  747. originalmente, un objeto <code>Zend_Form_SubForm</code>. éste último
  748. contiene decoradores apropiados para la inclusión en un formulario extenso (i.e.,
  749. no se generan adicionales formulario etiquetas HTML, pero si grupos de
  750. elementos). Para adjuntar un sub formulario, simplemente añádalo al formulario y déle
  751. un nombre:
  752. </para>
  753. <programlisting role="php"><![CDATA[
  754. $form->addSubForm($subForm, 'subform');
  755. ]]>
  756. </programlisting>
  757. <para>
  758. Se puede recuperar un sub formulario usando ya sea
  759. <code>getSubForm($name)</code> o sobrecarga usando el nombre
  760. del sub formulario:
  761. </para>
  762. <programlisting role="php"><![CDATA[
  763. // Usando getSubForm():
  764. $subForm = $form->getSubForm('subform');
  765. // Usando sobrecarga:
  766. $subForm = $form->subform;
  767. ]]>
  768. </programlisting>
  769. <para>
  770. Los Subformularios son incluidos en la interacción del formulario, sin embargo los elementos
  771. que lo contienen no lo son
  772. </para>
  773. <sect3 id="zend.form.forms.subforms.global">
  774. <title>Operaciones Globales</title>
  775. <para>
  776. Como los elementos y los grupos de visualización, existen algunas operaciones que
  777. pueden afectar a todos los sub formularios. A diferencia de los grupos de visualización y los
  778. elementos, sin embargo, los sub formularios heredan más funcionalidad del
  779. objeto formulario principal, y la única operación real que puede
  780. realizarse globalmente es determinar decoradores para sub formularios. Para
  781. este propósito, existe el método <code>setSubFormDecorators()</code>.
  782. En el siguiente ejemplo, determinaremos el decorador para todos los
  783. subformularios que sera un simple campo (el decorador FormElements es
  784. necesario para asegurar que los elementos son iterados):
  785. </para>
  786. <programlisting role="php"><![CDATA[
  787. $form->setSubFormDecorators(array(
  788. 'FormElements',
  789. 'Fieldset'
  790. ));
  791. ]]>
  792. </programlisting>
  793. </sect3>
  794. <sect3 id="zend.form.forms.subforms.methods">
  795. <title>Métodos para interactuar con Sub Formularios</title>
  796. <para>
  797. Los siguientes métodos pueden ser usados para interactuar con sub formularios:
  798. </para>
  799. <itemizedlist>
  800. <listitem><para>
  801. <code>addSubForm(Zend_Form $form, $name, $order = null)</code>
  802. </para></listitem>
  803. <listitem><para>
  804. <code>addSubForms(array $subForms)</code>
  805. </para></listitem>
  806. <listitem><para>
  807. <code>setSubForms(array $subForms)</code>
  808. </para></listitem>
  809. <listitem><para>
  810. <code>getSubForm($name)</code>
  811. </para></listitem>
  812. <listitem><para>
  813. <code>getSubForms()</code>
  814. </para></listitem>
  815. <listitem><para>
  816. <code>removeSubForm($name)</code>
  817. </para></listitem>
  818. <listitem><para>
  819. <code>clearSubForms()</code>
  820. </para></listitem>
  821. <listitem><para>
  822. <code>setSubFormDecorators(array $decorators)</code>
  823. </para></listitem>
  824. </itemizedlist>
  825. </sect3>
  826. </sect2>
  827. <sect2 id="zend.form.forms.metadata">
  828. <title>Metadatos y Atributos</title>
  829. <para>
  830. Mientras la utilidad de un formulario primariamente deriva de los elementos
  831. que contiene, también pueden contener otros metadatos, como un nombre (usado
  832. a menudo como ID único en el marcado HTML ); la accion y el método del formulario;
  833. el número de elementos, grupos y sub formularios que lo contienen; y
  834. arbitrariamente metadatos (usualmente usados para determinar atributos HTML para la
  835. etiqueta del propio formulario).
  836. </para>
  837. <para>
  838. Se puede determinar y recuperar el nombre del formulario usando el accesor nombre:
  839. </para>
  840. <programlisting role="php"><![CDATA[
  841. // Determinar el nombre:
  842. $form->setName('registration');
  843. // Recuperar el nombre:
  844. $name = $form->getName();
  845. ]]>
  846. </programlisting>
  847. <para>
  848. Para determinar la acción (url en el cual se envia el formulario) y método (método
  849. por el cual debería enviar, ej. 'POST' or 'GET'), use los accesores acción
  850. y método:
  851. </para>
  852. <programlisting role="php"><![CDATA[
  853. // Determinar la acción y método:
  854. $form->setAction('/user/login')
  855. ->setMethod('post');
  856. ]]>
  857. </programlisting>
  858. <para>
  859. Se puede también especificar el tipo de codificación del fomulario usando el
  860. enctype accessors. Zend_Form define dos constantes,
  861. <code>Zend_Form::ENCTYPE_URLENCODED</code> y
  862. <code>Zend_Form::ENCTYPE_MULTIPART</code>, correspondiente a los
  863. valores 'application/x-www-form-urlencoded' y
  864. 'multipart/form-data', respectivamente; sin embargo, puede configurarlo
  865. con cualquier tipo de codificación.
  866. </para>
  867. <programlisting role="php"><![CDATA[
  868. // Determinar la acción, método y enctype:
  869. $form->setAction('/user/login')
  870. ->setMethod('post')
  871. ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
  872. ]]>
  873. </programlisting>
  874. <note>
  875. <para>
  876. El método, acción y enctype son solo usados internamente para generar,
  877. y no para algún tipo de validación.
  878. </para>
  879. </note>
  880. <para>
  881. <code>Zend_Form</code> implementa la interfaz <code>Countable</code>
  882. permitiéndole pasarlo como un argumento para contar:
  883. </para>
  884. <programlisting role="php"><![CDATA[
  885. $numItems = count($form);
  886. ]]>
  887. </programlisting>
  888. <para>
  889. Determinar metadatos arbitrariamente se realiza a través de los accesores 'atribs'.
  890. Dado que la sobrecarga en <code>Zend_Form</code> es usada para acceder
  891. elementos, grupos de visualización y subformularios, este es el único método para
  892. acceder a los metadatos.
  893. </para>
  894. <programlisting role="php"><![CDATA[
  895. // Determinando atributos:
  896. $form->setAttrib('class', 'zend-form')
  897. ->addAttribs(array(
  898. 'id' => 'registration',
  899. 'onSubmit' => 'validate(this)',
  900. ));
  901. // Recuperando atributos:
  902. $class = $form->getAttrib('class');
  903. $attribs = $form->getAttribs();
  904. // Removiendo atributos:
  905. $form->removeAttrib('onSubmit');
  906. // Limpiando todos los atributos:
  907. $form->clearAttribs();
  908. ]]>
  909. </programlisting>
  910. </sect2>
  911. <sect2 id="zend.form.forms.decorators">
  912. <title>Decoradores</title>
  913. <para>
  914. Crear el marcado para un formulario es a menudo una tarea que consume mucho tiempo,
  915. particularmente si se planea reusar el mismo marcado para mostrar acciones
  916. tales como validación de errores, enviar valores, etc.
  917. La respuesta de <code>Zend_Form</code> a este problema es los
  918. <emphasis>decoradores</emphasis>.
  919. </para>
  920. <para>
  921. Los decoradores para objetos <code>Zend_Form</code> pueden ser usados para generar
  922. un formulario. El decorador FormElements iterará a través de todos los elementos en
  923. un formulario -- elementos, grupos de visualización y subformularios -- y los generará,
  924. devolviendo el resultado. Adicionalmente, los decoradores pueden ser usados
  925. para envolver el contenido o anteponerlo o postponerlo.
  926. </para>
  927. <para>
  928. Los decoradores por defecto de <code>Zend_Form</code> son FormElements,
  929. HtmlTag (envuelve una lista de definición) y Form; el código equivalente
  930. para crearlos es como sigue:
  931. </para>
  932. <programlisting role="php"><![CDATA[
  933. $form->setDecorators(array(
  934. 'FormElements',
  935. array('HtmlTag', array('tag' => 'dl')),
  936. 'Form'
  937. ));
  938. ]]>
  939. </programlisting>
  940. <para>
  941. Que crea la salida como sigue:
  942. </para>
  943. <programlisting role="html"><![CDATA[
  944. <form action="/form/action" method="post">
  945. <dl>
  946. ...
  947. </dl>
  948. </form>
  949. ]]>
  950. </programlisting>
  951. <para>
  952. Algunos de los atributos se determinan en el objeto formulario que será usado como
  953. atributos HTML de la etiqueta <code>&lt;form&gt;</code>.
  954. </para>
  955. <note>
  956. <title>Decoradores por defecto que no necesitan ser cargados</title>
  957. <para>
  958. Por defecto, el decorador por defecto son cargados durante la
  959. inicialización del objeto. Puede deshabilitarlo pasando la
  960. opción 'disableLoadDefaultDecorators' al constructor:
  961. </para>
  962. <programlisting role="php"><![CDATA[
  963. $form = new Zend_Form(array('disableLoadDefaultDecorators' => true));
  964. ]]>
  965. </programlisting>
  966. <para>
  967. Esta opción puede ser combinada con alguna otra opción que usted pueda pasar,
  968. tanto como opciones de array o en un objeto <code>Zend_Config</code>
  969. </para>
  970. </note>
  971. <note>
  972. <title>Usando multiples decoradores del mismo tipo</title>
  973. <para>
  974. Internamente, <code>Zend_Form</code> usa una clase decorador
  975. como un mecanismo buscador cuando se recuperan decoradores. Como
  976. resultado, no se pueden registrar multiples decoradores del mismo
  977. tipo; subsecuentemente los decoradores simplemente sobrescribirán esos
  978. decoradores que existían antes.
  979. </para>
  980. <para>
  981. Para conseguir esto, se pueden usar alias. En vez de pasar un
  982. decorador o un nombre de decorador como primer argumento a
  983. <code>addDecorator()</code>, pase un array con un solo
  984. elemento, con el alias apuntando al objeto decorador o
  985. nombre:
  986. </para>
  987. <programlisting role="php"><![CDATA[
  988. // Alias para 'FooBar':
  989. $form->addDecorator(array('FooBar' => 'HtmlTag'), array('tag' => 'div'));
  990. // y recuperarlo después:
  991. $form = $element->getDecorator('FooBar');
  992. ]]>
  993. </programlisting>
  994. <para>
  995. En los métodos <code>addDecorators()</code> y
  996. <code>setDecorators()</code>, se necesitará pasar
  997. la opción 'decorator' en el array representando el decorador:
  998. </para>
  999. <programlisting role="php"><![CDATA[
  1000. // Añadir dos decoradores 'HtmlTag', poniendo un alias a 'FooBar':
  1001. $form->addDecorators(
  1002. array('HtmlTag', array('tag' => 'div')),
  1003. array(
  1004. 'decorator' => array('FooBar' => 'HtmlTag'),
  1005. 'options' => array('tag' => 'dd')
  1006. ),
  1007. );
  1008. // y recuperándolo después:
  1009. $htmlTag = $form->getDecorator('HtmlTag');
  1010. $fooBar = $form->getDecorator('FooBar');
  1011. ]]>
  1012. </programlisting>
  1013. </note>
  1014. <para>
  1015. Puede crear su propio decorador para generar el formulario. Un
  1016. caso de uso común es si sabe el HTML exacto que desea usar; su
  1017. decorador puede crear el mismo HTML y simplemente retornarlo,
  1018. potencialmente usando los decoradores de individuales elementos o
  1019. grupos de visualización.
  1020. </para>
  1021. <para>
  1022. Los siguientes métodos puden ser usados para interactuar con decoradores:
  1023. </para>
  1024. <itemizedlist>
  1025. <listitem><para>
  1026. <code>addDecorator($decorator, $options = null)</code>
  1027. </para></listitem>
  1028. <listitem><para>
  1029. <code>addDecorators(array $decorators)</code>
  1030. </para></listitem>
  1031. <listitem><para>
  1032. <code>setDecorators(array $decorators)</code>
  1033. </para></listitem>
  1034. <listitem><para>
  1035. <code>getDecorator($name)</code>
  1036. </para></listitem>
  1037. <listitem><para>
  1038. <code>getDecorators()</code>
  1039. </para></listitem>
  1040. <listitem><para>
  1041. <code>removeDecorator($name)</code>
  1042. </para></listitem>
  1043. <listitem><para>
  1044. <code>clearDecorators()</code>
  1045. </para></listitem>
  1046. </itemizedlist>
  1047. <para>
  1048. <code>Zend_Form</code> también usa sobrecarga que permite generar
  1049. decoradores específicos. <code>__call()</code> interceptará métodos
  1050. que lleve con el texto 'render' y use el resto del nombre del método
  1051. para buscar un decorador; si se encuentran, serán generados por un
  1052. <emphasis>solo</emphasis> decorador. Cualquier argumento pasado a la
  1053. llamada del método será usado como contenido que pasar al método
  1054. <code>render()</code> del decorador. Como ejemplo:
  1055. </para>
  1056. <programlisting role="php"><![CDATA[
  1057. // Generar solo los decoradores FormElements:
  1058. echo $form->renderFormElements();
  1059. // Generar solo el campo decorador, pasando el contenido:
  1060. echo $form->renderFieldset("<p>This is fieldset content</p>");
  1061. ]]></programlisting>
  1062. <para>
  1063. Si el decorador no existe, una excepción se creará.
  1064. </para>
  1065. </sect2>
  1066. <sect2 id="zend.form.forms.validation">
  1067. <title>Validación</title>
  1068. <para>
  1069. Un caso de uso primario para formularios es validar datos enviados.
  1070. <code>Zend_Form</code> le permite validar un formulario entero de una vez,
  1071. o una parte de él, asi como también automatizar las respuestas de validación para
  1072. XmlHttpRequests (AJAX). Si los datos enviados no son válidos, contiene
  1073. métodos para recuperar los distintos códigos errores y los mensajes de
  1074. elementos y subformularios de validaciones fallidas.
  1075. </para>
  1076. <para>
  1077. Para validar un formulario entero, use el método <code>isValid()</code>:
  1078. </para>
  1079. <programlisting role="php"><![CDATA[
  1080. if (!$form->isValid($_POST)) {
  1081. // validación fallida
  1082. }
  1083. ]]>
  1084. </programlisting>
  1085. <para>
  1086. <code>isValid()</code> validará cada elemento requerido, y algún
  1087. elemento no requerido contenido en la data sometida.
  1088. </para>
  1089. <para>
  1090. Algunas veces se necesitará validar sólo un subset del dato; para
  1091. esto use <code>isValidPartial($data)</code>:
  1092. </para>
  1093. <programlisting role="php"><![CDATA[
  1094. if (!$form->isValidPartial($data)) {
  1095. // validación fallida
  1096. }
  1097. ]]>
  1098. </programlisting>
  1099. <para>
  1100. <code>isValidPartial()</code> sólo intenta validar aquellos elementos
  1101. en la información para los cuales existen similares elementos; si un elemento es
  1102. no representado en la información, es pasado por alto.
  1103. </para>
  1104. <para>
  1105. Cuando se validan elementos o grupos de elementos para un requeirimiento AJAX,
  1106. típicamente se validará un subset del formulario, y quiere la respuesta
  1107. en JSON. <code>processAjax()</code> precisamente realiza eso:
  1108. </para>
  1109. <programlisting role="php"><![CDATA[
  1110. $json = $form->processAjax($data);
  1111. ]]>
  1112. </programlisting>
  1113. <para>
  1114. Entonces, puede simplemente enviar la respuesta JSON al cliente. Si el
  1115. formulario es válido, ésta será una respuesta booleana. Si no, será
  1116. un objeto javascript conteniendo pares de clave/mensaje, donde cada
  1117. 'message' es un array de validación de mensajes de error.
  1118. </para>
  1119. <para>
  1120. Para los formularios que fallan la validación, se pueden recuperar ambos códigos
  1121. de error y mensajes de error, usando <code>getErrors()</code> y
  1122. <code>getMessages()</code>, respectivamente:
  1123. </para>
  1124. <programlisting role="php"><![CDATA[
  1125. $codes = $form->getErrors();
  1126. $messages = $form->getMessage();
  1127. ]]>
  1128. </programlisting>
  1129. <note>
  1130. <para>
  1131. Dado que los mensajes devueltos por <code>getMessages()</code> son un
  1132. array de pares de errores código/mensaje, <code>getErrors()</code> no
  1133. es necesario.
  1134. </para>
  1135. </note>
  1136. <para>
  1137. Puede recuperar códigos y mensajes de error para elementos individuales
  1138. simplemente pasando el nombre del elemento a cada uno:
  1139. </para>
  1140. <programlisting role="php"><![CDATA[
  1141. $codes = $form->getErrors('username');
  1142. $messages = $form->getMessages('username');
  1143. ]]>
  1144. </programlisting>
  1145. <note>
  1146. <para>
  1147. Nota: Cuando validamos elementos, <code>Zend_Form</code> envía un
  1148. segundo argumento a cada método <code>isValid()</code> del elemento:
  1149. el array de los datos que se están validando. Esto puede ser usado por
  1150. validadores individuales para permitirles utilizar otros valores
  1151. enviados al determinar la validez de los datos. Un ejemplo
  1152. sería un formulario de registro que requiere tanto una contraseña
  1153. como una confirmación de la contraseña; el elemento contraseña puede usar la
  1154. confirmación de la contraseña como parte de su validación.
  1155. </para>
  1156. </note>
  1157. <sect3 id="zend.form.forms.validation.errors">
  1158. <title>Mensajes de error personalizados</title>
  1159. <para>
  1160. A veces, puede querer especificar uno o más mensajes
  1161. de error en vez de los mensajes de error generados por los
  1162. validadores adjuntos a los elementos. Adicionalmente, a veces
  1163. puede querer marcar el formulario inválido usted mismo. Como 1.6.0,
  1164. esta funcionalidad es posible siguiendo los métodos.
  1165. At times, you may want to specify one or more specific error
  1166. messages to use instead of the error messages generated by the
  1167. validators attached to your elements. Additionally, at times you
  1168. may want to mark the form invalid yourself. As of 1.6.0, this
  1169. functionality is possible via the following methods.
  1170. </para>
  1171. <itemizedlist>
  1172. <listitem><para>
  1173. <code>addErrorMessage($message)</code>: añade un mensaje de error
  1174. para desplegar en el formulario los errores de validación. Se debe llamar más
  1175. de una vez, y los nuevos mensajes son adicionados a la pila.
  1176. </para></listitem>
  1177. <listitem><para>
  1178. <code>addErrorMessages(array $messages)</code>: añade múltiples
  1179. mensajes de error para desplegar en el formulario los errores de validación
  1180. </para></listitem>
  1181. <listitem><para>
  1182. <code>setErrorMessages(array $messages)</code>: añade multiples
  1183. mensajes de error para desplegar en el formulario los errores de validación,
  1184. sobrescribiendo todos los mensajes de error previamente determinados.
  1185. </para></listitem>
  1186. <listitem><para>
  1187. <code>getErrorMessages()</code>: recupera la lista de
  1188. mensajes de error personalizados que han sido definidos.
  1189. </para></listitem>
  1190. <listitem><para>
  1191. <code>clearErrorMessages()</code>: remueve todos los mensajes
  1192. de error personalizados que han sido definidos.
  1193. </para></listitem>
  1194. <listitem><para>
  1195. <code>markAsError()</code>: marca el formulario como que la
  1196. validación ha fallado.
  1197. </para></listitem>
  1198. <listitem><para>
  1199. <code>addError($message)</code>: añade un mensaje a la pila de
  1200. mensajes de error personalizados y señala al formulario como inválido.
  1201. </para></listitem>
  1202. <listitem><para>
  1203. <code>addErrors(array $messages)</code>: añade muchos
  1204. mensajes a la pila de mensajes de error personalizados y señala al
  1205. formulario como inválido.
  1206. </para></listitem>
  1207. <listitem><para>
  1208. <code>setErrors(array $messages)</code>: sobrescribe la
  1209. pila de mensajes de error personalizada con los mensajes proporcionados
  1210. y señala el formulario como inválido.
  1211. </para></listitem>
  1212. </itemizedlist>
  1213. <para>
  1214. Todos los errores determinados de esta manera pueden ser traducidos.
  1215. </para>
  1216. </sect3>
  1217. </sect2>
  1218. <sect2 id="zend.form.forms.methods">
  1219. <title>Métodos</title>
  1220. <para>
  1221. La siguiente lista es la lista completa de métodos disponibles para
  1222. <code>Zend_Form</code>, agrupados por tipo:
  1223. </para>
  1224. <itemizedlist>
  1225. <listitem><para>Configuración y opciones:</para>
  1226. <itemizedlist>
  1227. <listitem><para><code>setOptions(array $options)</code></para></listitem>
  1228. <listitem><para><code>setConfig(Zend_Config $config)</code></para></listitem>
  1229. </itemizedlist>
  1230. </listitem>
  1231. <listitem><para>Cargadores de plugins y rutas:</para>
  1232. <itemizedlist>
  1233. <listitem><para><code>setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type = null)</code></para></listitem>
  1234. <listitem><para><code>getPluginLoader($type = null)</code></para></listitem>
  1235. <listitem><para><code>addPrefixPath($prefix, $path, $type = null) </code></para></listitem>
  1236. <listitem><para><code>addPrefixPaths(array $spec)</code></para></listitem>
  1237. <listitem><para><code>addElementPrefixPath($prefix, $path, $type = null)</code></para></listitem>
  1238. <listitem><para><code>addElementPrefixPaths(array $spec)</code></para></listitem>
  1239. <listitem><para><code>addDisplayGroupPrefixPath($prefix, $path)</code></para></listitem>
  1240. </itemizedlist>
  1241. </listitem>
  1242. <listitem><para>Metadato:</para>
  1243. <itemizedlist>
  1244. <listitem><para><code>setAttrib($key, $value)</code></para></listitem>
  1245. <listitem><para><code>addAttribs(array $attribs)</code></para></listitem>
  1246. <listitem><para><code>setAttribs(array $attribs)</code></para></listitem>
  1247. <listitem><para><code>getAttrib($key)</code></para></listitem>
  1248. <listitem><para><code>getAttribs()</code></para></listitem>
  1249. <listitem><para><code>removeAttrib($key)</code></para></listitem>
  1250. <listitem><para><code>clearAttribs()</code></para></listitem>
  1251. <listitem><para><code>setAction($action)</code></para></listitem>
  1252. <listitem><para><code>getAction()</code></para></listitem>
  1253. <listitem><para><code>setMethod($method)</code></para></listitem>
  1254. <listitem><para><code>getMethod()</code></para></listitem>
  1255. <listitem><para><code>setName($name)</code></para></listitem>
  1256. <listitem><para><code>getName()</code></para></listitem>
  1257. </itemizedlist>
  1258. </listitem>
  1259. <listitem><para>Elementos:</para>
  1260. <itemizedlist>
  1261. <listitem><para><code>addElement($element, $name = null, $options = null)</code></para></listitem>
  1262. <listitem><para><code>addElements(array $elements)</code></para></listitem>
  1263. <listitem><para><code>setElements(array $elements)</code></para></listitem>
  1264. <listitem><para><code>getElement($name)</code></para></listitem>
  1265. <listitem><para><code>getElements()</code></para></listitem>
  1266. <listitem><para><code>removeElement($name)</code></para></listitem>
  1267. <listitem><para><code>clearElements()</code></para></listitem>
  1268. <listitem><para><code>setDefaults(array $defaults)</code></para></listitem>
  1269. <listitem><para><code>setDefault($name, $value)</code></para></listitem>
  1270. <listitem><para><code>getValue($name)</code></para></listitem>
  1271. <listitem><para><code>getValues()</code></para></listitem>
  1272. <listitem><para><code>getUnfilteredValue($name)</code></para></listitem>
  1273. <listitem><para><code>getUnfilteredValues()</code></para></listitem>
  1274. <listitem><para><code>setElementFilters(array $filters)</code></para></listitem>
  1275. <listitem><para><code>setElementDecorators(array $decorators)</code></para></listitem>
  1276. </itemizedlist>
  1277. </listitem>
  1278. <listitem><para>Subformularios:</para>
  1279. <itemizedlist>
  1280. <listitem><para><code>addSubForm(Zend_Form $form, $name, $order = null)</code></para></listitem>
  1281. <listitem><para><code>addSubForms(array $subForms)</code></para></listitem>
  1282. <listitem><para><code>setSubForms(array $subForms)</code></para></listitem>
  1283. <listitem><para><code>getSubForm($name)</code></para></listitem>
  1284. <listitem><para><code>getSubForms()</code></para></listitem>
  1285. <listitem><para><code>removeSubForm($name)</code></para></listitem>
  1286. <listitem><para><code>clearSubForms()</code></para></listitem>
  1287. <listitem><para><code>setSubFormDecorators(array $decorators)</code></para></listitem>
  1288. </itemizedlist>
  1289. </listitem>
  1290. <listitem><para>Grupos de Visualización</para>
  1291. <itemizedlist>
  1292. <listitem><para><code>addDisplayGroup(array $elements, $name, $options = null)</code></para></listitem>
  1293. <listitem><para><code>addDisplayGroups(array $groups)</code></para></listitem>
  1294. <listitem><para><code>setDisplayGroups(array $groups)</code></para></listitem>
  1295. <listitem><para><code>getDisplayGroup($name)</code></para></listitem>
  1296. <listitem><para><code>getDisplayGroups()</code></para></listitem>
  1297. <listitem><para><code>removeDisplayGroup($name)</code></para></listitem>
  1298. <listitem><para><code>clearDisplayGroups()</code></para></listitem>
  1299. <listitem><para><code>setDisplayGroupDecorators(array $decorators)</code></para></listitem>
  1300. </itemizedlist>
  1301. </listitem>
  1302. <listitem><para>Validación</para>
  1303. <itemizedlist>
  1304. <listitem><para><code>populate(array $values)</code></para></listitem>
  1305. <listitem><para><code>isValid(array $data)</code></para></listitem>
  1306. <listitem><para><code>isValidPartial(array $data)</code></para></listitem>
  1307. <listitem><para><code>processAjax(array $data)</code></para></listitem>
  1308. <listitem><para><code>persistData()</code></para></listitem>
  1309. <listitem><para><code>getErrors($name = null)</code></para></listitem>
  1310. <listitem><para><code>getMessages($name = null)</code></para></listitem>
  1311. </itemizedlist>
  1312. </listitem>
  1313. <listitem><para>Generadores:</para>
  1314. <itemizedlist>
  1315. <listitem><para><code>setView(Zend_View_Interface $view = null)</code></para></listitem>
  1316. <listitem><para><code>getView()</code></para></listitem>
  1317. <listitem><para><code>addDecorator($decorator, $options = null)</code></para></listitem>
  1318. <listitem><para><code>addDecorators(array $decorators)</code></para></listitem>
  1319. <listitem><para><code>setDecorators(array $decorators)</code></para></listitem>
  1320. <listitem><para><code>getDecorator($name)</code></para></listitem>
  1321. <listitem><para><code>getDecorators()</code></para></listitem>
  1322. <listitem><para><code>removeDecorator($name)</code></para></listitem>
  1323. <listitem><para><code>clearDecorators()</code></para></listitem>
  1324. <listitem><para><code>render(Zend_View_Interface $view = null)</code></para></listitem>
  1325. </itemizedlist>
  1326. </listitem>
  1327. <listitem><para>I18n:</para>
  1328. <itemizedlist>
  1329. <listitem><para><code>setTranslator(Zend_Translate_Adapter $translator = null)</code></para></listitem>
  1330. <listitem><para><code>getTranslator()</code></para></listitem>
  1331. <listitem><para><code>setDisableTranslator($flag)</code></para></listitem>
  1332. <listitem><para><code>translatorIsDisabled()</code></para></listitem>
  1333. </itemizedlist>
  1334. </listitem>
  1335. </itemizedlist>
  1336. </sect2>
  1337. <sect2 id="zend.form.forms.config">
  1338. <title>Configuración</title>
  1339. <para>
  1340. <code>Zend_Form</code> es totalmente configurable mediante
  1341. <code>setOptions()</code> y <code>setConfig()</code> (o
  1342. pasando opciones o un objeto <code>Zend_Config</code> al
  1343. constructor). Usando estos métodos, se pueden especificar elementos formulario,
  1344. grupos de visualización, decoradores, y metadatos.
  1345. </para>
  1346. <para>
  1347. Como regla general, si 'set' + la clave de opción (option key) hacen referencia a
  1348. métodos <code>Zend_Form</code>, entonces el valor proporcionado será
  1349. pasado al método. Si el accessor no existe, se asume que la clave
  1350. referencia a un atributo, y será pasado a
  1351. <code>setAttrib()</code>.
  1352. </para>
  1353. <para>
  1354. Excepciones a las reglas incluyen lo siguiente:
  1355. </para>
  1356. <itemizedlist>
  1357. <listitem><para>
  1358. <code>prefixPaths</code> será pasado a
  1359. <code>addPrefixPaths()</code>
  1360. </para></listitem>
  1361. <listitem><para>
  1362. <code>elementPrefixPaths</code> será pasado a
  1363. <code>addElementPrefixPaths()</code>
  1364. </para></listitem>
  1365. <listitem><para>
  1366. <code>displayGroupPrefixPaths</code> será pasado a
  1367. <code>addDisplayGroupPrefixPaths()</code>
  1368. </para></listitem>
  1369. <listitem>
  1370. <para>los siguientes establecedores no pueden ser determinado de ésta manera:</para>
  1371. <itemizedlist>
  1372. <listitem><para><code>setAttrib (aunque setAttribs *funcionará*)</code></para></listitem>
  1373. <listitem><para><code>setConfig</code></para></listitem>
  1374. <listitem><para><code>setDefault</code></para></listitem>
  1375. <listitem><para><code>setOptions</code></para></listitem>
  1376. <listitem><para><code>setPluginLoader</code></para></listitem>
  1377. <listitem><para><code>setSubForms</code></para></listitem>
  1378. <listitem><para><code>setTranslator</code></para></listitem>
  1379. <listitem><para><code>setView</code></para></listitem>
  1380. </itemizedlist>
  1381. </listitem>
  1382. </itemizedlist>
  1383. <para>
  1384. Como un ejemplo, aquí esta un archivo de configuración que pasa la configuración
  1385. por cada tipo de datos configurables:
  1386. </para>
  1387. <programlisting role="ini"><![CDATA[
  1388. [element]
  1389. name = "registration"
  1390. action = "/user/register"
  1391. method = "post"
  1392. attribs.class = "zend_form"
  1393. attribs.onclick = "validate(this)"
  1394. disableTranslator = 0
  1395. prefixPath.element.prefix = "My_Element"
  1396. prefixPath.element.path = "My/Element/"
  1397. elementPrefixPath.validate.prefix = "My_Validate"
  1398. elementPrefixPath.validate.path = "My/Validate/"
  1399. displayGroupPrefixPath.prefix = "My_Group"
  1400. displayGroupPrefixPath.path = "My/Group/"
  1401. elements.username.type = "text"
  1402. elements.username.options.label = "Username"
  1403. elements.username.options.validators.alpha.validator = "Alpha"
  1404. elements.username.options.filters.lcase = "StringToLower"
  1405. ; more elements, of course...
  1406. elementFilters.trim = "StringTrim"
  1407. ;elementDecorators.trim = "StringTrim"
  1408. displayGroups.login.elements.username = "username"
  1409. displayGroups.login.elements.password = "password"
  1410. displayGroupDecorators.elements.decorator = "FormElements"
  1411. displayGroupDecorators.fieldset.decorator = "Fieldset"
  1412. decorators.elements.decorator = "FormElements"
  1413. decorators.fieldset.decorator = "FieldSet"
  1414. decorators.fieldset.decorator.options.class = "zend_form"
  1415. decorators.form.decorator = "Form"
  1416. ]]>
  1417. </programlisting>
  1418. <para>
  1419. El código de arriba fácilmente puede ser abstraído a un XML o un archivo de configuración basado en arrays PHP.
  1420. </para>
  1421. </sect2>
  1422. <sect2 id="zend.form.forms.custom">
  1423. <title>Formularios personalizados</title>
  1424. <para>
  1425. Una alternativa a usar los formularios basados en configuraciones es realizar una subclase de
  1426. <code>Zend_Form</code>. Esto tiene muchos beneficios:
  1427. </para>
  1428. <itemizedlist>
  1429. <listitem><para>
  1430. Se puede centrar la prueba de su formulario facilmente para asegurar las validaciones y
  1431. generar la ejecución esperada.
  1432. </para></listitem>
  1433. <listitem><para>
  1434. Control preciso sobre los individuales elementos.
  1435. </para></listitem>
  1436. <listitem><para>
  1437. Reutilización del objeto formulario, y mejor portabilidad (no se necesita
  1438. seguir los archivos de configuración).
  1439. </para></listitem>
  1440. <listitem><para>
  1441. Implementar funcionalidad personalizada.
  1442. </para></listitem>
  1443. </itemizedlist>
  1444. <para>
  1445. El caso mas típico de uso sería el método
  1446. <code>init()</code> para determinar elementos de formulario específicos y
  1447. de configuración:
  1448. </para>
  1449. <programlisting role="php"><![CDATA[
  1450. class My_Form_Login extends Zend_Form
  1451. {
  1452. public function init()
  1453. {
  1454. $username = new Zend_Form_Element_Text('username');
  1455. $username->class = 'formtext';
  1456. $username->setLabel('Username:')
  1457. ->setDecorators(array(
  1458. array('ViewHelper',
  1459. array('helper' => 'formText')),
  1460. array('Label',
  1461. array('class' => 'label'))
  1462. ));
  1463. $password = new Zend_Form_Element_Password('password');
  1464. $password->class = 'formtext';
  1465. $password->setLabel('Username:')
  1466. ->setDecorators(array(
  1467. array('ViewHelper',
  1468. array('helper' => 'formPassword')),
  1469. array('Label',
  1470. array('class' => 'label'))
  1471. ));
  1472. $submit = new Zend_Form_Element_Submit('login');
  1473. $submit->class = 'formsubmit';
  1474. $submit->setValue('Login')
  1475. ->setDecorators(array(
  1476. array('ViewHelper',
  1477. array('helper' => 'formSubmit'))
  1478. ));
  1479. $this->addElements(array(
  1480. $username,
  1481. $password,
  1482. $submit
  1483. ));
  1484. $this->setDecorators(array(
  1485. 'FormElements',
  1486. 'Fieldset',
  1487. 'Form'
  1488. ));
  1489. }
  1490. }
  1491. ]]>
  1492. </programlisting>
  1493. <para>
  1494. Este formulario puede ser instanciado simplemente así:
  1495. </para>
  1496. <programlisting role="php"><![CDATA[
  1497. $form = new My_Form_Login();
  1498. ]]>
  1499. </programlisting>
  1500. <para>
  1501. y toda la funcionalidad está instalada y lista; no se necesitan archivos
  1502. de configuración. (Note que este ejemplo esta simplificado, no contiene
  1503. validadores o filtros para los elementos.)
  1504. </para>
  1505. <para>
  1506. Otra razón común para la extension es definir un conjunto de
  1507. decoradores por defecto. Puede hacerlo sobreescribiendo el
  1508. método <code>loadDefaultDecorators()</code>:
  1509. </para>
  1510. <programlisting role="php"><![CDATA[
  1511. class My_Form_Login extends Zend_Form
  1512. {
  1513. public function loadDefaultDecorators()
  1514. {
  1515. $this->setDecorators(array(
  1516. 'FormElements',
  1517. 'Fieldset',
  1518. 'Form'
  1519. ));
  1520. }
  1521. }
  1522. ]]>
  1523. </programlisting>
  1524. </sect2>
  1525. </sect1>
  1526. <!--
  1527. vim:se ts=4 sw=4 et:
  1528. -->