Zend_Form-Forms.xml 95 KB

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