Zend_Form-Forms.xml 90 KB

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