Zend_Form-Forms.xml 101 KB

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