Zend_Form-Elements.xml 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20115 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.form.elements">
  5. <title>Creando elementos de formulario usando Zend_Form_Element</title>
  6. <para> Un formulario esta compuesto de elementos, que normalmente
  7. corresponden al elemento HTML input.
  8. <classname>Zend_Form_Element</classname> encapsula elementos de
  9. formulario individualmente, con las siguientes áreas de responsabilidad: </para>
  10. <itemizedlist>
  11. <listitem>
  12. <para>validación (¿los datos enviados son válidos?)</para>
  13. <itemizedlist>
  14. <listitem>
  15. <para>captura de códigos y mensajes de error</para>
  16. </listitem>
  17. </itemizedlist>
  18. </listitem>
  19. <listitem>
  20. <para>filtrado (¿cómo es escapado y normalizado el elemento para su
  21. validación y/o salida?</para>
  22. </listitem>
  23. <listitem>
  24. <para>generación (¿cómo es mostrado el elemento?)</para>
  25. </listitem>
  26. <listitem>
  27. <para>metadatos y atributos (¿qué información amplía la definición
  28. del elemento?)</para>
  29. </listitem>
  30. </itemizedlist>
  31. <para> La clase base, <classname>Zend_Form_Element</classname> , funciona
  32. por defecto para varios casos, pero es mejor extender la clase para
  33. elementos con fines especiales de uso común. Adicionalmente, Zend
  34. Framework contiene un número de elementos <acronym>XHTML</acronym>
  35. estándar; puede leer de ellos <link linkend="zend.form.standardElements"
  36. >en el capítulo Elementos Estándares</link>
  37. </para>
  38. <sect2 id="zend.form.elements.loaders">
  39. <title>Cargadores de Plugin</title>
  40. <para>
  41. <classname>Zend_Form_Element</classname> hace uso de <link
  42. linkend="zend.loader.pluginloader"
  43. >Zend_Loader_PluginLoader</link> para permitir a los
  44. desarrolladores especificar ubicaciones de validadores, filtros y
  45. decoradores alternos. Cada uno tiene su propio cargador de plugin
  46. asociado a él y métodos de acceso generales usados para su
  47. recuperación y modificación. </para>
  48. <para>Los siguientes tipos de cargadores son usados con los varios
  49. métodos del cargador de plugin: 'validate', 'filter', y 'decorator'.
  50. Los nombres son sensibles a mayúsculas y minúsculas.</para>
  51. <para>Los métodos usados para interactuar con los cargadores de plugin
  52. son los siguientes:</para>
  53. <itemizedlist>
  54. <listitem>
  55. <para>
  56. <methodname>setPluginLoader($loader, $type)</methodname> :
  57. <varname>$loader</varname> es el propio objeto cargador,
  58. mientras <varname></varname> es uno de los tipos arriba
  59. mencionados. Esto establece el cargador de plugin para el
  60. tipo dado en el objeto cargador recién especificado. </para>
  61. </listitem>
  62. <listitem>
  63. <para>
  64. <methodname>getPluginLoader()</methodname> : obtiene el
  65. cargador de plugin asociado con <varname></varname> .
  66. </para>
  67. </listitem>
  68. <listitem>
  69. <para>
  70. <methodname>addPrefixPath($prefix, $path, $type =
  71. null)</methodname> : agrega una asociación prefijo/ruta
  72. para el cargador especificado por <varname>$type</varname> .
  73. Si <varname>$type</varname> es <constant>NULL</constant>, se intentará agregar la
  74. ruta a todos los cargadores, añadiendo el prefijo a cada
  75. "_Validate", "_Filter" y "_Decorator"; y agregandole
  76. "Validate/", "Filter/" y "Decorator/" a la ruta. Si tiene
  77. todas sus clases extras para elementos de formulario dentro
  78. de una jerarquía común, este método es conveniente para
  79. establecer el prefijo para todas ellas. </para>
  80. </listitem>
  81. <listitem>
  82. <para>
  83. <methodname>addPrefixPaths(array $spec)</methodname> : le
  84. permite añadir varias rutas de una sola vez a uno o más
  85. cargadores de plugin. Se espera cada elemento de la matriz
  86. sea un array con claves 'path', 'prefix', y 'type'. </para>
  87. </listitem>
  88. </itemizedlist>
  89. <para>Validadores, filtros y decoradores personalizados son una manera
  90. simple de compartir funcionalidad entre formularios y encapsular
  91. funcionalidad personalizada.</para>
  92. <example id="zend.form.elements.loaders.customLabel">
  93. <title>Etiqueta personalizada</title>
  94. <para>Un uso común de los plugins es proveer reemplazos para las
  95. clases estándares. Por ejemplo, si desea proveer una
  96. implementación diferente del decorador 'Label' -- por ejemplo,
  97. para añadir siempre dos puntos -- puede crear su propio
  98. decorador 'Label' con su propio prefijo de clase, y entonces
  99. añadirlo a su prefijo de ruta.</para>
  100. <para>Comencemos con un decorador de etiqueta personalizado. Le
  101. daremos el prefijo "My_Decorator", y la clase estará en el
  102. archivo "My/Decorator/Label.php".</para>
  103. <programlisting language="php"><![CDATA[
  104. class My_Decorator_Label extends Zend_Form_Decorator_Abstract
  105. {
  106. protected $_placement = 'PREPEND';
  107. public function render($content)
  108. {
  109. if (null === ($element = $this->getElement())) {
  110. return $content;
  111. }
  112. if (!method_exists($element, 'getLabel')) {
  113. return $content;
  114. }
  115. $label = $element->getLabel() . ':';
  116. if (null === ($view = $element->getView())) {
  117. return $this->renderLabel($content, $label);
  118. }
  119. $label = $view->formLabel($element->getName(), $label);
  120. return $this->renderLabel($content, $label);
  121. }
  122. public function renderLabel($content, $label)
  123. {
  124. $placement = $this->getPlacement();
  125. $separator = $this->getSeparator();
  126. switch ($placement) {
  127. case 'APPEND':
  128. return $content . $separator . $label;
  129. case 'PREPEND':
  130. default:
  131. return $label . $separator . $content;
  132. }
  133. }
  134. }
  135. ]]></programlisting>
  136. <para>Ahora diremos al elemento que use esta ruta cuando busque por
  137. decoradores:</para>
  138. <programlisting language="php"><![CDATA[
  139. $element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  140. ]]></programlisting>
  141. <para>Alternativamente, podemos hacerlo en el formulario para
  142. asegurar que todos los decoradores usen esta ruta:</para>
  143. <programlisting language="php"><![CDATA[
  144. $form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  145. ]]></programlisting>
  146. <para>Con esta ruta añadida, cuando agregue un decorador, la ruta
  147. 'My/Decorator' será consultada primero en búsqueda de la
  148. existencia del decorador en este lugar. Como resultado,
  149. 'My_Decorator_Label' ahora será utilizado cuando el decorador
  150. 'Label' sea requerido.</para>
  151. </example>
  152. </sect2>
  153. <sect2 id="zend.form.elements.filters">
  154. <title>Filters</title>
  155. <para> A menudo es útil y/o necesario realizar alguna normalización en
  156. la entrada antes de la validación – por ejemplo, puede querer
  157. eliminar todo el <acronym>HTML</acronym> , pero realizar las
  158. validaciones sobre lo restante para asegurarse que el envío es
  159. válido. O puede eliminar los espacios en blanco al inicio o fin de
  160. la entrada para asegurarse de que un validador StringLenth (longitud
  161. de la cadena) no regrese un positivo falso. Estas operaciones pueden
  162. realizarse usando <classname>Zend_Filter</classname> , y
  163. <classname>Zend_Form_Element</classname> que soportan cadenas de
  164. filtros, permitiéndole especificar múltiples filtros secuenciales a
  165. utilizar. El filtrado sucede tanto en la validación como cuando
  166. recupera el valor del elemento vía
  167. <methodname>getValue()</methodname> : </para>
  168. <programlisting language="php"><![CDATA[
  169. $filtered = $element->getValue();
  170. ]]></programlisting>
  171. <para>Los filtros pueden ser agregados a la pila de dos maneras:</para>
  172. <itemizedlist>
  173. <listitem>
  174. <para>pasándolo en una instancia de filtro específica</para>
  175. </listitem>
  176. <listitem>
  177. <para>proveyendo un nombre de filtro – el correspondiente nombre
  178. corto o completo de la clase</para>
  179. </listitem>
  180. </itemizedlist>
  181. <para>Veamos algunos ejemplos:</para>
  182. <programlisting language="php"><![CDATA[
  183. // Instancia específica del filtro
  184. $element->addFilter(new Zend_Filter_Alnum());
  185. // El correspondiente nombre completo de la clase:
  186. $element->addFilter('Zend_Filter_Alnum');
  187. // Nombre corto del filtro:
  188. $element->addFilter('Alnum');
  189. $element->addFilter('alnum');
  190. ]]></programlisting>
  191. <para>Los nombres cortos son típicamente el nombre del filtro sin el
  192. prefijo. En el caso predeterminado, esto se refiere a sin el prefijo
  193. 'Zend_Filter_'. Además, la primera letra no necesita estar en
  194. mayúscula.</para>
  195. <note>
  196. <title>Usando clases de filtros personalizados</title>
  197. <para> Si tiene su propio conjunto de clases de filtro, puede
  198. informarle de ellas a <classname>Zend_Form_Element</classname>
  199. usando <methodname>addPrefixPath()</methodname> . Por ejemplo,
  200. si tiene filtros con el prefijo 'My_Filter', puede indicárselo a
  201. <classname>Zend_Form_Element</classname> de la siguiente
  202. manera: </para>
  203. <programlisting language="php"><![CDATA[
  204. $element->addPrefixPath('My_Filter', 'My/Filter/', 'filter');
  205. ]]></programlisting>
  206. <para>(Recuerde que el tercer argumento indica el cargador de plugin
  207. sobre el cual ha de ejecutarse la acción.)</para>
  208. </note>
  209. <para> Si en algún momento necesita un valor no filtrado, use el método
  210. <methodname>getUnfilteredValue()</methodname> : </para>
  211. <programlisting language="php"><![CDATA[
  212. $unfiltered = $element->getUnfilteredValue();
  213. ]]></programlisting>
  214. <para> Para mayor información sobre filtros, vea la <link
  215. linkend="zend.filter.introduction">documentación de
  216. Zend_Filter</link> . </para>
  217. <para>Métodos asociados con filtros incluyen:</para>
  218. <itemizedlist>
  219. <listitem>
  220. <para>
  221. <methodname>addFilter($nameOfFilter, array $options =
  222. null)</methodname>
  223. </para>
  224. </listitem>
  225. <listitem>
  226. <para>
  227. <methodname>addFilters(array $filters)</methodname>
  228. </para>
  229. </listitem>
  230. <listitem>
  231. <para>
  232. <methodname>setFilters(array $filters)</methodname>
  233. (sobreescribe todos los filtros) </para>
  234. </listitem>
  235. <listitem>
  236. <para>
  237. <methodname>getFilter($name)</methodname> (recupera un
  238. objeto filtro por su nombre) </para>
  239. </listitem>
  240. <listitem>
  241. <para>
  242. <methodname>getFilters()</methodname> (recupera todos los
  243. filtros) </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. <methodname>removeFilter($name)</methodname> (elimina un
  248. filtro por su nombre) </para>
  249. </listitem>
  250. <listitem>
  251. <para>
  252. <methodname>clearFilters()</methodname> (elimina todos los
  253. filtros) </para>
  254. </listitem>
  255. </itemizedlist>
  256. </sect2>
  257. <sect2 id="zend.form.elements.validators">
  258. <title>Validadores</title>
  259. <para> Si sigue el mantra de seguridad "filtrar la entrada, escapar la
  260. salida" querrá validar ("filtrar la entrada") los datos de los
  261. formularios. En <classname>Zend_Form</classname> cada elemento
  262. contiene su propia cadena de validadores, consistente en validadores
  263. <methodname>Zend_Validate_*</methodname> . </para>
  264. <para>Los validadores pueden ser agregados de dos maneras:</para>
  265. <itemizedlist>
  266. <listitem>
  267. <para>pasándolo en una instancia de validador específica </para>
  268. </listitem>
  269. <listitem>
  270. <para>proveyendo un nombre de validador – el correspondiente
  271. nombre corto o completo de clase</para>
  272. </listitem>
  273. </itemizedlist>
  274. <para>Veamos algunos ejemplos:</para>
  275. <programlisting language="php"><![CDATA[
  276. // Instancia específica del validador:
  277. $element->addValidator(new Zend_Validate_Alnum());
  278. // El correspondiente nombre completo de la clase:
  279. $element->addValidator('Zend_Validate_Alnum');
  280. // Nombre corto del validador:
  281. $element->addValidator('Alnum');
  282. $element->addValidator('alnum');
  283. ]]></programlisting>
  284. <para>Los nombres cortos son típicamente el nombre del validador sin el
  285. prefijo. En el caso predeterminado, esto se refiere a sin el prefijo
  286. 'Zend_Validate_'. Además, la primera letra no necesita estar en
  287. mayúscula.</para>
  288. <note>
  289. <title>Usando clases de validación personalizadas</title>
  290. <para> Si tiene su propio conjunto de clases de validación, puede
  291. informarle de ellas a <classname>Zend_Form_Element</classname>
  292. usando <methodname>addPrefixPath()</methodname> . Por ejemplo,
  293. si tiene validadores con el prefijo 'My_Validator', puede
  294. indicárselo a <classname>Zend_Form_Element</classname> de la
  295. siguiente manera: </para>
  296. <programlisting language="php"><![CDATA[
  297. $element->addPrefixPath('My_Validator', 'My/Validator/', 'validate');
  298. ]]></programlisting>
  299. <para>(Recuerde que el tercer argumento indica el cargador de plugin
  300. sobre el cual ha de ejecutarse la acción.)</para>
  301. </note>
  302. <para> Si el fallo de un validador debe evitar validaciones posteriores,
  303. pase el boleano <constant>TRUE</constant> como segundo parámetro: </para>
  304. <programlisting language="php"><![CDATA[
  305. $element->addValidator('alnum', true);
  306. ]]></programlisting>
  307. <para> Si está usando la cadena nombre para añadir el validador, y la
  308. clase del validador acepta argumentos para su constructor, puede
  309. pasarlos a el tercer parámetro de
  310. <methodname>addValidator()</methodname> como un array: </para>
  311. <programlisting language="php"><![CDATA[
  312. $element->addValidator('StringLength', false, array(6, 20));
  313. ]]></programlisting>
  314. <para> Los argumentos pasados de esta manera deben estar en el orden en
  315. el cual son definidos en el constructor. El ejemplo de arriba
  316. instanciará la clase
  317. <classname>Zend_Validate_StringLenth</classname> con los
  318. parámetros <varname>$min</varname> y <varname>$max</varname> : </para>
  319. <programlisting language="php"><![CDATA[
  320. $validator = new Zend_Validate_StringLength(6, 20);
  321. ]]></programlisting>
  322. <note>
  323. <title>Estipulando mensajes de error de validación
  324. personalizados</title>
  325. <para> Algunos desarrolladores querrán estipular mensajes de error
  326. personalizados para un validador. El argumento
  327. <varname>$options</varname> de
  328. <methodname>Zend_Form_Element::addValidator()</methodname>
  329. le permite hacerlo proporcionando la clave 'messages' y
  330. estableciendolos en un array de pares clave/valor para
  331. especificar las plantillas de mensaje. Necesitará conocer los
  332. códigos de error de los diferentes tipos de error de un
  333. validador en particular. </para>
  334. <para> Una opción mejor es usar
  335. <classname>Zend_Translate_Adapter</classname> con su
  336. formulario. Los códigos de error son automáticamente pasados al
  337. adaptador por el decorador Errors por defecto; puede especificar
  338. su propias cadenas de mensaje de error mediante la creación de
  339. traducciones para los varios códigos de error de sus
  340. validadores. </para>
  341. </note>
  342. <para> Puede también establecer varios validadores a la vez, usando
  343. <methodname>addValidators()</methodname> . Su uso básico es
  344. pasar una matriz de arrays, donde cada array contenga de 1 a 3
  345. valores, correspondientes al constructor de
  346. <methodname>addValidator()</methodname> : </para>
  347. <programlisting language="php"><![CDATA[
  348. $element->addValidators(array(
  349. array('NotEmpty', true),
  350. array('alnum'),
  351. array('stringLength', false, array(6, 20)),
  352. ));
  353. ]]></programlisting>
  354. <para>Si quiere ser más detallado o explícito, puede utilizar las claves
  355. 'validator', 'breakChainOnFailure', y 'options' en el array:</para>
  356. <programlisting language="php"><![CDATA[
  357. $element->addValidators(array(
  358. array(
  359. 'validator' => 'NotEmpty',
  360. 'breakChainOnFailure' => true),
  361. array('validator' => 'alnum'),
  362. array(
  363. 'validator' => 'stringLength',
  364. 'options' => array(6, 20)),
  365. ));
  366. ]]></programlisting>
  367. <para>Este uso es bueno para ilustrar cómo puede configurar validadores
  368. en un archivo de configuración:</para>
  369. <programlisting language="ini"><![CDATA[
  370. element.validators.notempty.validator = "NotEmpty"
  371. element.validators.notempty.breakChainOnFailure = true
  372. element.validators.alnum.validator = "Alnum"
  373. element.validators.strlen.validator = "StringLength"
  374. element.validators.strlen.options.min = 6
  375. element.validators.strlen.options.max = 20
  376. ]]></programlisting>
  377. <para>Note que cada elemento tiene una clave, la necesite o no; esta es
  378. una limitación del uso de archivos de configuración -- pero también
  379. ayuda a hacer más explicito el para qué son usados los argumentos.
  380. Sólo recuerde que cualesquiera opciones del validador deben ser
  381. especificadas en orden.</para>
  382. <para> Para validar un elemento, pase el valor a
  383. <methodname>isValid()</methodname> : </para>
  384. <programlisting language="php"><![CDATA[
  385. if ($element->isValid($value)) {
  386. // válido
  387. } else {
  388. // no válido
  389. }
  390. ]]></programlisting>
  391. <note>
  392. <title>Validación operando en valores filtrados</title>
  393. <para>
  394. <methodname>Zend_Form_Element::isValid()</methodname> > siempre
  395. filtra los valores antes de la validación a través de la cadena
  396. de filtros. Vea <link linkend="zend.form.elements.filters">la
  397. sección de filtros</link> para más información. </para>
  398. </note>
  399. <note>
  400. <title>Contexto de validación</title>
  401. <para>
  402. <methodname>Zend_Form_Element::isValid()</methodname> > soporta
  403. un argumento adicional, <varname>$context</varname> .
  404. <methodname>Zend_Form::isValid()</methodname> pasa todo el
  405. conjunto de datos procesados a <varname>$context</varname>
  406. cuando valida un formulario, y
  407. <methodname>Zend_Form_Element::isValid()</methodname> >, a
  408. su vez, lo pasa a cada validador. Esto significa que puede
  409. escribir validadores que son conscientes de los datos pasados a
  410. otros elementos del formulario. Como ejemplo, considere un
  411. formulario de registro estándar que tiene campos para la
  412. contraseña y la confirmación de la contraseña; una validación
  413. sería que los dos campos coincidan. Este validador puede tener
  414. un aspecto como el siguiente: </para>
  415. <programlisting language="php"><![CDATA[
  416. class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract
  417. {
  418. const NOT_MATCH = 'notMatch';
  419. protected $_messageTemplates = array(
  420. self::NOT_MATCH => 'Password confirmation does not match'
  421. );
  422. public function isValid($value, $context = null)
  423. {
  424. $value = (string) $value;
  425. $this->_setValue($value);
  426. if (is_array($context)) {
  427. if (isset($context['password_confirm'])
  428. && ($value == $context['password_confirm']))
  429. {
  430. return true;
  431. }
  432. } elseif (is_string($context) && ($value == $context)) {
  433. return true;
  434. }
  435. $this->_error(self::NOT_MATCH);
  436. return false;
  437. }
  438. }
  439. ]]></programlisting>
  440. </note>
  441. <para> Los validadores son procesados en orden. Cada validador es
  442. procesado, a menos que un validador creado con un valor true para
  443. <methodname>breakChainOnFailure</methodname> falle su
  444. validación. Asegúrese de especificar sus validadores en un orden
  445. razonable. </para>
  446. <para>Después de una validación fallida, puede recuperar los códigos y
  447. mensajes de error de la cadena del validador:</para>
  448. <programlisting language="php"><![CDATA[
  449. $errors = $element->getErrors();
  450. $messages = $element->getMessages();
  451. ]]></programlisting>
  452. <para>(Nota: los mensajes de error retornados son un array asociativo de
  453. pares código / mensaje de error.)</para>
  454. <para> En adición a los validadores, puede especificar que un elemento
  455. es necesario, usando <methodname>setRequired(true)</methodname> .
  456. Por defecto, esta bandera es <constant>FALSE</constant> , lo que
  457. significa que pasará su cadena de validadores si ningún valor es
  458. pasado a <methodname>isValid()</methodname> . Puede modificar este
  459. comportamiento en un número de maneras: </para>
  460. <itemizedlist>
  461. <listitem>
  462. <para> Por defecto, cuando un elemento es requerido, una
  463. bandera, 'allowEmpty', también es true. Esto quiere decir
  464. que si un valor empty es evaluado pasándolo a
  465. <methodname>isValid()</methodname> , los validadores
  466. serán saltados. Puede intercalar esta bandera usando el
  467. método de acceso
  468. <methodname>setAllowEmpty($flag)</methodname> ; cuando
  469. la bandera es false, si un valor es pasado, los validadores
  470. seguirán ejecutándose. </para>
  471. </listitem>
  472. <listitem>
  473. <para> Por defecto, si un elemento es requerido, pero no
  474. contiene un validador 'NotEmpty',
  475. <methodname>isValid()</methodname> añadirá uno en la
  476. cima de la pila, con la bandera
  477. <methodname>breakChainOnFailure</methodname>
  478. establecido. Esto hace que la bandera requerida tenga un
  479. significado semántico: si ningún valor es pasado,
  480. inmediatamente invalidamos el envío y se le notifica al
  481. usuario, e impedimos que otros validadores se ejecuten en lo
  482. que ya sabemos son datos inválidos. </para>
  483. <para> Si no quiere este comportamiento, puede desactivarlo
  484. pasando un valor false a
  485. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  486. ; esto prevendrá a <methodname>isValid()</methodname> de
  487. colocar un validador 'NotEmpty' en la cadena de
  488. validaciones. </para>
  489. </listitem>
  490. </itemizedlist>
  491. <para> Para mayor información sobre validadores, vea la <link
  492. linkend="zend.validate.introduction">documentación de
  493. Zend_Validate</link> . </para>
  494. <note>
  495. <title>Usando Zend_Form_Elements como validador de propósito
  496. general</title>
  497. <para>
  498. <classname>Zend_Form_Element</classname> implementa
  499. <classname>Zend_Validate_Interface</classname> ,
  500. significando un elemento puede también usarse como un validador
  501. en otro, cadenas de validación no relacionadas al formulario.
  502. </para>
  503. </note>
  504. <para>Métodos asociados con validación incluyen:</para>
  505. <itemizedlist>
  506. <listitem>
  507. <para>
  508. <methodname>setRequired($flag)</methodname> y
  509. <methodname>isRequired()</methodname> permiten
  510. establecer y recuperar el estado de la bandera 'required'.
  511. Cuando se le asigna un booleano <constant>TRUE</constant> ,
  512. esta bandera requiere que el elemento esté presente en la
  513. información procesada por <classname>Zend_Form</classname> .
  514. </para>
  515. </listitem>
  516. <listitem>
  517. <para>
  518. <methodname>setAllowEmpty($flag)</methodname> y
  519. <methodname>getAllowEmpty()</methodname> permiten
  520. modificar el comportamiento de elementos opcionales (p.e.,
  521. elementos donde la bandera required es <constant>FALSE</constant>). Cuando la
  522. bandera 'allow empty' es <constant>TRUE</constant> , valores
  523. vacíos no pasarán la cadena de validadores. </para>
  524. </listitem>
  525. <listitem>
  526. <para>
  527. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  528. permite especificar si realmente un validador 'NotEmpty'
  529. será añadido el inicio de la cadena de validaciones cuando
  530. un elemento es requerido. Por defecto, esta bandera es
  531. <constant>TRUE</constant> . </para>
  532. </listitem>
  533. <listitem>
  534. <para>
  535. <methodname>addValidator($nameOrValidator,
  536. $breakChainOnFailure = false, array $options =
  537. null)</methodname>
  538. </para>
  539. </listitem>
  540. <listitem>
  541. <para>
  542. <methodname>addValidators(array $validators)</methodname>
  543. </para>
  544. </listitem>
  545. <listitem>
  546. <para>
  547. <methodname>setValidators(array $validators)</methodname>
  548. (sobreescribe todos los validadores) </para>
  549. </listitem>
  550. <listitem>
  551. <para>
  552. <methodname>getValidator($name)</methodname> (recupera un
  553. objeto validador por nombre) </para>
  554. </listitem>
  555. <listitem>
  556. <para>
  557. <methodname>getValidators()</methodname> (recupera todos los
  558. validadores) </para>
  559. </listitem>
  560. <listitem>
  561. <para>
  562. <methodname>removeValidator($name)</methodname> (elimina un
  563. validador por nombre) </para>
  564. </listitem>
  565. <listitem>
  566. <para>
  567. <methodname>clearValidators()</methodname> (elimina todos
  568. los validadores) </para>
  569. </listitem>
  570. </itemizedlist>
  571. <sect3 id="zend.form.elements.validators.errors">
  572. <title>Errores de mensaje personalizados</title>
  573. <para>Alguna veces, querrá especificar uno o más mensajes de error
  574. para usarlos en lugar de los mensajes de error generados por los
  575. validadores adjuntos a los elementos. Adicionalmente, algunas
  576. veces usted mismo querrá marcar al elemento como inválido. A
  577. partir de 1.6.0, esta funcionalidad es posible vía los
  578. siguientes métodos.</para>
  579. <itemizedlist>
  580. <listitem>
  581. <para>
  582. <methodname>addErrorMessage($message)</methodname> :
  583. añade un mensaje de error para mostrarlos en forma de
  584. errores de validación. Puede llamarlo más de una vez, y
  585. los nuevos mensajes nuevos son añadidos a la pila.
  586. </para>
  587. </listitem>
  588. <listitem>
  589. <para>
  590. <methodname>addErrorMessages(array
  591. $messages)</methodname> : añade múltiples mensajes
  592. de error para mostrarlos en forma de errores de
  593. validación. </para>
  594. </listitem>
  595. <listitem>
  596. <para>
  597. <methodname>setErrorMessages(array
  598. $messages)</methodname> : añade múltiples mensajes
  599. de error para mostrarlos en forma de errores de
  600. validación, sobreescribiendo todos los mensajes de error
  601. previamente establecidos. </para>
  602. </listitem>
  603. <listitem>
  604. <para>
  605. <methodname>getErrorMessages()</methodname> : recupera
  606. la lista de mensajes de error personalizados que fueron
  607. definidos. </para>
  608. </listitem>
  609. <listitem>
  610. <para>
  611. <methodname>clearErrorMessages()</methodname> : remueve
  612. todos los mensajes de error personalizados que hayan
  613. sido definidos. </para>
  614. </listitem>
  615. <listitem>
  616. <para>
  617. <methodname>markAsError()</methodname> : marca al
  618. elemento como que falló la validación. </para>
  619. </listitem>
  620. <listitem>
  621. <para>
  622. <methodname>hasErrors()</methodname> : determina si el
  623. elemento ha fallado la validación o ha sido marcado como
  624. inválido. </para>
  625. </listitem>
  626. <listitem>
  627. <para>
  628. <methodname>addError($message)</methodname> : añade un
  629. mensaje a la pila de mensaje de error personalizados y
  630. marca al elemento como inválido. </para>
  631. </listitem>
  632. <listitem>
  633. <para>
  634. <methodname>addErrors(array $messages)</methodname> :
  635. añade varios mensajes a la pila de mensajes de error
  636. personalizados y marca al elemento como inválido.
  637. </para>
  638. </listitem>
  639. <listitem>
  640. <para>
  641. <methodname>setErrors(array $messages)</methodname> :
  642. sobreescribe el mensaje de error personalizado en la
  643. pila con los mensajes previstos y marca al elemento como
  644. inválido. </para>
  645. </listitem>
  646. </itemizedlist>
  647. <para>Todos los errores establecidos de este modo pueden ser
  648. traducidos. Adicionalmente, puede insertar el marcador "%value%"
  649. para representar el valor del elemento; este valor actual del
  650. elemento será sustituido cuando el mensaje de error sea
  651. recuperado.</para>
  652. </sect3>
  653. </sect2>
  654. <sect2 id="zend.form.elements.decorators">
  655. <title>Decoradores</title>
  656. <para> Una dolencia particular para muchos desarrolladores web es la
  657. creación del <acronym>XHTML</acronym> para formularios por ellos
  658. mismos. Para cada elemento, el desarrollador necesita crear la
  659. marcación para el elemento mismo, comúnmente una etiqueta (label),
  660. y, si son amables con sus usuarios, la marcación para mostrar
  661. mensajes de errores de validación. Cuanto más elementos en una
  662. página, menos trivial se convierte esta tarea. </para>
  663. <para>
  664. <classname>Zend_Form_Element</classname> intenta resolver este
  665. problema mediante el uso de "decoradores". Los decoradores son
  666. clases simples que tienen métodos de acceso al elemento y métodos
  667. para generar el contenido. Para obtener mayor información sobre cómo
  668. trabajan los decoradores, consulte por favor la sección sobre <link
  669. linkend="zend.form.decorators">Zend_Form_Decorator</link> . </para>
  670. <para> Los decoradores usados por defecto por
  671. <classname>Zend_Form_Element</classname> son: </para>
  672. <itemizedlist>
  673. <listitem>
  674. <para>
  675. <emphasis>ViewHelper</emphasis> : especifica un view helper
  676. que usar para general el elemento. El atributo 'helper' del
  677. elemento puede usarse para especificar qué auxiliar vista
  678. usar. Por defecto, <classname>Zend_Form_Element</classname>
  679. especifica el auxiliar vista 'formText', pero cada subclase
  680. especifica diferentes auxiliares. </para>
  681. </listitem>
  682. <listitem>
  683. <para>
  684. <emphasis>Errors</emphasis> : añade mensajes de error al
  685. elemento usando
  686. <classname>Zend_View_Helper_FormErrors</classname> . Si
  687. no está presente, no se añade nada. </para>
  688. </listitem>
  689. <listitem>
  690. <para>
  691. <emphasis>Description</emphasis>: añade la descripción del
  692. elemento. Si no está presente, no se añade nada. Por
  693. defecto, la descripción es generada dentro de una etiqueta
  694. &lt;p&gt; con un class 'description'. </para>
  695. </listitem>
  696. <listitem>
  697. <para>
  698. <emphasis>HtmlTag</emphasis>: envuelve el elemento y los
  699. errores en una etiqueta HTML &lt;dd&gt;. </para>
  700. </listitem>
  701. <listitem>
  702. <para>
  703. <emphasis>Label</emphasis> : añade al comienzo una etiqueta
  704. al elemento usando
  705. <classname>Zend_View_Helper_FormLabel</classname>, y
  706. envolviéndola en una etiqueta &lt;dt&gt;. Si ninguna
  707. etiqueta es provista, solo la etiqueta de la definición es
  708. generada. </para>
  709. </listitem>
  710. </itemizedlist>
  711. <note>
  712. <title>Decoradores por defecto no necesitan ser cargados</title>
  713. <para>Por defecto, los decoradores por defecto son cargados durante
  714. la inicialización del objeto. Puede deshabilitar esto pasando la
  715. opción 'disableLoadDefaultDecorators' al constructor:</para>
  716. <programlisting language="php"><![CDATA[
  717. $element = new Zend_Form_Element('foo',
  718. array('disableLoadDefaultDecorators' =>
  719. true)
  720. );
  721. ]]></programlisting>
  722. <para> Esta opción puede ser combinada junto con cualquier otra
  723. opción que pase, ya sea como un array de opciones o en un objeto
  724. <classname>Zend_Config</classname> . </para>
  725. </note>
  726. <para>Ya que el orden en el cual los decoradores son registrados importa
  727. -- el primer decorador registrado es ejecutado primero -- necesitará
  728. estar seguro de registrar sus decoradores en el orden apropiado, o
  729. asegurarse de que estableció las opciones de colocación en el modo
  730. apropiado. Por dar un ejemplo, aquí esta el código que registran los
  731. decoradores por defecto:</para>
  732. <programlisting language="php"><![CDATA[
  733. $this->addDecorators(array(
  734. array('ViewHelper'),
  735. array('Errors'),
  736. array('Description', array('tag' => 'p', 'class' => 'description')),
  737. array('HtmlTag', array('tag' => 'dd')),
  738. array('Label', array('tag' => 'dt')),
  739. ));
  740. ]]></programlisting>
  741. <para>El contenido inicial es creado por el decorador 'ViewHelper', que
  742. crea el propio elemento. En seguida, el decorador 'Errors' consulta
  743. los mensajes de error del elemento, y, si hay alguno presente, los
  744. pasa al auxiliar vista 'FormErrors' para mostrarlos. Si una
  745. descripción está presente, el decorador 'Description' añadirá un
  746. párrafo con class 'description' conteniendo el texto descriptivo
  747. para el contenido agregado. El siguiente decorador, 'HtmlTag',
  748. envuelve al elemento, los errores, y la descripción en una etiqueta
  749. HTML &lt;dd&gt;. Finalmente, el último decorador, 'label',
  750. recupera la etiqueta del elemento y la pasa al auxiliar vista
  751. 'FormLabel', envolviéndolo en una etiqueta &lt;dt&gt;; por
  752. default el valor es añadido al inicio del contenido. El resultado de
  753. la salida básicamente se ve así:</para>
  754. <programlisting language="html"><![CDATA[
  755. <dt><label for="foo" class="optional">Foo</label></dt>
  756. <dd>
  757. <input type="text" name="foo" id="foo" value="123" />
  758. <ul class="errors">
  759. <li>"123" is not an alphanumeric value</li>
  760. </ul>
  761. <p class="description">
  762. This is some descriptive text regarding the element.
  763. </p>
  764. </dd>
  765. ]]></programlisting>
  766. <para> Para más información sobre decoradores, lea la <link
  767. linkend="zend.form.decorators"> sección de
  768. Zend_Form_Decorator</link> . </para>
  769. <note>
  770. <title>Usando múltiples decoradores al mismo tiempo</title>
  771. <para> Internamente, <classname>Zend_Form_Element</classname>
  772. utiliza una clase decorador como mecanismo de búsqueda para la
  773. recuperación de decoradores. Como resultado, no puede registrar
  774. múltiples decoradores del mismo tipo; decoradores subsecuentes
  775. simplemente sobreescribirán aquellos que ya existían. </para>
  776. <para> Para evitar esto, puede usar <emphasis>alias</emphasis> . En
  777. lugar de pasar un decorador o nombre de decorador como primer
  778. argumento a <methodname>addDecorator()</methodname> , pase una
  779. matriz con un solo elemento, con el alias apuntando al nombre o
  780. objeto decorador: </para>
  781. <programlisting language="php"><![CDATA[
  782. // Alias a 'FooBar':
  783. $element->addDecorator(array('FooBar' => 'HtmlTag'),
  784. array('tag' => 'div'));
  785. // Y recuperandolo posteriormente:
  786. $decorator = $element->getDecorator('FooBar');
  787. ]]></programlisting>
  788. <para> En los métodos <methodname>addDecorators()</methodname> y
  789. <methodname>setDecorators()</methodname> , necesitará pasar
  790. la opción 'decorator' en la matriz representando el decorador: </para>
  791. <programlisting language="php"><![CDATA[
  792. // Y dos decoradores 'HtmlTag', 'FooBar' como alias:
  793. $element->addDecorators(
  794. array('HtmlTag', array('tag' => 'div')),
  795. array(
  796. 'decorator' => array('FooBar' => 'HtmlTag'),
  797. 'options' => array('tag' => 'dd')
  798. ),
  799. );
  800. // Y recuperándolos posteriormente:
  801. $htmlTag = $element->getDecorator('HtmlTag');
  802. $fooBar = $element->getDecorator('FooBar');
  803. ]]></programlisting>
  804. </note>
  805. <para>Métodos asociados con decoradores incluyen:</para>
  806. <itemizedlist>
  807. <listitem>
  808. <para>
  809. <methodname>addDecorator($nameOrDecorator, array $options =
  810. null)</methodname>
  811. </para>
  812. </listitem>
  813. <listitem>
  814. <para>
  815. <methodname>addDecorators(array $decorators)</methodname>
  816. </para>
  817. </listitem>
  818. <listitem>
  819. <para>
  820. <methodname>setDecorators(array $decorators)</methodname>
  821. (sobreescribe todos los decoradores) </para>
  822. </listitem>
  823. <listitem>
  824. <para>
  825. <methodname>getDecorator($name)</methodname> (recupera un
  826. objeto decorador por su nombre) </para>
  827. </listitem>
  828. <listitem>
  829. <para>
  830. <methodname>getDecorators()</methodname> (recupera todos los
  831. decoradores) </para>
  832. </listitem>
  833. <listitem>
  834. <para>
  835. <methodname>removeDecorator($name)</methodname> (elimina un
  836. decorador por su nombre) </para>
  837. </listitem>
  838. <listitem>
  839. <para>
  840. <methodname>clearDecorators()</methodname> (elimina todos
  841. los decoradores) </para>
  842. </listitem>
  843. </itemizedlist>
  844. <para>
  845. <classname>Zend_Form_Element</classname> también utiliza la
  846. sobrecarga para permitir generar decoradores específicos.
  847. <methodname>__call()</methodname> interceptará métodos que
  848. comiencen con el texto 'render' y utilizará el resto del nombre del
  849. método para buscar un decorador; si se encuentra, entonces será
  850. generado <emphasis>sólo ese</emphasis> decorador. Cualquier
  851. argumento pasado al llamado del método será usado como contenido
  852. para pasar al método <methodname>render()</methodname> del
  853. decorador. Como ejemplo: </para>
  854. <programlisting language="php"><![CDATA[
  855. // Genera solo el decorador ViewHelper:
  856. echo $element->renderViewHelper();
  857. // Genera solo el decorador HtmlTag, pasándole contenido:
  858. echo $element->renderHtmlTag("This is the html tag content");
  859. ]]></programlisting>
  860. <para>Si el decorador no existe, una excepción es lanzada.</para>
  861. </sect2>
  862. <sect2 id="zend.form.elements.metadata">
  863. <title>Metadatos y atributos</title>
  864. <para>
  865. <classname>Zend_Form_Element</classname> manipula una variedad de
  866. atributos y medatados del elemento. Atributos básicos incluyen: </para>
  867. <itemizedlist>
  868. <listitem>
  869. <para>
  870. <emphasis>name</emphasis> : el nombre del elemento. Emplea
  871. los métodos de acceso <methodname>setName()</methodname> y
  872. <methodname>getName()</methodname> . </para>
  873. </listitem>
  874. <listitem>
  875. <para>
  876. <emphasis>label</emphasis> : la etiqueta del elemento.
  877. Emplea los métodos de acceso
  878. <methodname>setLabel()</methodname> y
  879. <methodname>getLabel()</methodname> . </para>
  880. </listitem>
  881. <listitem>
  882. <para>
  883. <emphasis>order</emphasis> : el índice en el cual los
  884. elementos deben ir mostrándose en el formulario. Emplea los
  885. métodos de acceso <methodname>setOrder()</methodname> y
  886. <methodname>getOrder()</methodname> . </para>
  887. </listitem>
  888. <listitem>
  889. <para>
  890. <emphasis>value</emphasis> : El valor del elemento actual.
  891. Emplea los métodos de acceso
  892. <methodname>setValue()</methodname> y
  893. <methodname>getValue()</methodname> . </para>
  894. </listitem>
  895. <listitem>
  896. <para>
  897. <emphasis>description</emphasis> : una descripción del
  898. elemento; a menudo utilizada para proveer un tooltip o ayuda
  899. contextual con javascript describiendo el propósito del
  900. elemento. Emplea los métodos de acceso
  901. <methodname>setDescription()</methodname> y
  902. <methodname>getDescription()</methodname> . </para>
  903. </listitem>
  904. <listitem>
  905. <para>
  906. <emphasis>required</emphasis> : bandera que indica si un
  907. elemento es requerido o no cuando se efectúa la validación
  908. del formulario. Emplea los métodos de acceso
  909. <methodname>setRequired()</methodname> y
  910. <methodname>isRequired()</methodname> . Esta bandera es
  911. <constant>FALSE</constant> por defecto. </para>
  912. </listitem>
  913. <listitem>
  914. <para>
  915. <emphasis>allowEmpty</emphasis> : bandera indicando si un
  916. elemento no-requerido (opcional) debe intentar validar o no
  917. valores vacíos. Cuando es <constant>TRUE</constant> , y la
  918. bandera required es <constant>FALSE</constant> , valores
  919. vacíos no pasarán la cadena de validación, y se supone
  920. verdadero. Emplea los métodos de acceso
  921. <methodname>setAllowEmpty()</methodname> y
  922. <methodname>getAllowEmpty()</methodname> . Esta bandera
  923. es <constant>TRUE</constant> por defecto. </para>
  924. </listitem>
  925. <listitem>
  926. <para>
  927. <emphasis>autoInsertNotEmptyValidator</emphasis> : bandera
  928. indicando insertar o no un validador 'NotEmpty' cuando un
  929. elemento es requerido. Por defecto, esta bandera es
  930. <constant>TRUE</constant> . Establezca la bandera con
  931. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  932. y determine el valor con
  933. <methodname>autoInsertNotEmptyValidator()</methodname> .
  934. </para>
  935. </listitem>
  936. </itemizedlist>
  937. <para> Los elementos del formulario pueden requerir metainformación
  938. adicional. Para elementos <acronym>XHTML</acronym> del formuladio,
  939. por ejemplo, puede querer especificar atributos como el class o id.
  940. Para facilitar esto hay un conjunto de métodos de acceso: </para>
  941. <itemizedlist>
  942. <listitem>
  943. <para>
  944. <emphasis>setAttrib($name, $value)</emphasis> : añade un
  945. atributo </para>
  946. </listitem>
  947. <listitem>
  948. <para>
  949. <emphasis>setAttribs(array $attribs)</emphasis> : como
  950. addAttribs(), pero sobreescribiendo </para>
  951. </listitem>
  952. <listitem>
  953. <para>
  954. <emphasis>getAttrib($name)</emphasis> : recupera el valor de
  955. solo un atributo </para>
  956. </listitem>
  957. <listitem>
  958. <para>
  959. <emphasis>getAttribs()</emphasis> : recupera todos los
  960. atributos como pares clave/valor </para>
  961. </listitem>
  962. </itemizedlist>
  963. <para> La mayoría de las veces, como sea, puede simplemente acceder a
  964. ellos como propiedades de objeto, ya que
  965. <classname>Zend_Form_Element</classname> utiliza la sobrecarga
  966. para facilitar el acceso a ellos: </para>
  967. <programlisting language="php"><![CDATA[
  968. // Equivalente a $element->setAttrib('class', 'text'):
  969. $element->class = 'text;
  970. ]]></programlisting>
  971. <para>Por defecto, todos los atributos son pasados al auxiliar vista
  972. usado por el elemento durante la generación, y generados como
  973. atributos de la etiqueta del elemento.</para>
  974. </sect2>
  975. <sect2 id="zend.form.elements.standard">
  976. <title>Elementos Estándar</title>
  977. <para>
  978. <classname>Zend_Form</classname> contiene un buen número de
  979. elementos estándar; por favor lea el capítulo <link
  980. linkend="zend.form.standardElements">Elementos Estándar</link>
  981. para todos los detalles. </para>
  982. </sect2>
  983. <sect2 id="zend.form.elements.methods">
  984. <title>Métodos de Zend_Form_Element</title>
  985. <para>
  986. <classname>Zend_Form_Element</classname> tiene muchos, muchos
  987. métodos. Lo que sigue es un sumario de sus funciones, agrupados por
  988. tipo: </para>
  989. <itemizedlist>
  990. <listitem>
  991. <para>Configuración:</para>
  992. <itemizedlist>
  993. <listitem>
  994. <para>
  995. <methodname>setOptions(array $options)</methodname>
  996. </para>
  997. </listitem>
  998. <listitem>
  999. <para>
  1000. <methodname>setConfig(Zend_Config
  1001. $config)</methodname>
  1002. </para>
  1003. </listitem>
  1004. </itemizedlist>
  1005. </listitem>
  1006. <listitem>
  1007. <para>I18n:</para>
  1008. <itemizedlist>
  1009. <listitem>
  1010. <para>
  1011. <methodname>setTranslator(Zend_Translate_Adapter
  1012. $translator = null)</methodname>
  1013. </para>
  1014. </listitem>
  1015. <listitem>
  1016. <para>
  1017. <methodname>getTranslator()</methodname>
  1018. </para>
  1019. </listitem>
  1020. <listitem>
  1021. <para>
  1022. <methodname>setDisableTranslator($flag)</methodname>
  1023. </para>
  1024. </listitem>
  1025. <listitem>
  1026. <para>
  1027. <methodname>translatorIsDisabled()</methodname>
  1028. </para>
  1029. </listitem>
  1030. </itemizedlist>
  1031. </listitem>
  1032. <listitem>
  1033. <para>Propiedades:</para>
  1034. <itemizedlist>
  1035. <listitem>
  1036. <para>
  1037. <methodname>setName($name)</methodname>
  1038. </para>
  1039. </listitem>
  1040. <listitem>
  1041. <para>
  1042. <methodname>getName()</methodname>
  1043. </para>
  1044. </listitem>
  1045. <listitem>
  1046. <para>
  1047. <methodname>setValue($value)</methodname>
  1048. </para>
  1049. </listitem>
  1050. <listitem>
  1051. <para>
  1052. <methodname>getValue()</methodname>
  1053. </para>
  1054. </listitem>
  1055. <listitem>
  1056. <para>
  1057. <methodname>getUnfilteredValue()</methodname>
  1058. </para>
  1059. </listitem>
  1060. <listitem>
  1061. <para>
  1062. <methodname>setLabel($label)</methodname>
  1063. </para>
  1064. </listitem>
  1065. <listitem>
  1066. <para>
  1067. <methodname>getLabel()</methodname>
  1068. </para>
  1069. </listitem>
  1070. <listitem>
  1071. <para>
  1072. <methodname>setDescription($description)</methodname>
  1073. </para>
  1074. </listitem>
  1075. <listitem>
  1076. <para>
  1077. <methodname>getDescription()</methodname>
  1078. </para>
  1079. </listitem>
  1080. <listitem>
  1081. <para>
  1082. <methodname>setOrder($order)</methodname>
  1083. </para>
  1084. </listitem>
  1085. <listitem>
  1086. <para>
  1087. <methodname>getOrder()</methodname>
  1088. </para>
  1089. </listitem>
  1090. <listitem>
  1091. <para>
  1092. <methodname>setRequired($flag)</methodname>
  1093. </para>
  1094. </listitem>
  1095. <listitem>
  1096. <para>
  1097. <methodname>isRequired()</methodname>
  1098. </para>
  1099. </listitem>
  1100. <listitem>
  1101. <para>
  1102. <methodname>setAllowEmpty($flag)</methodname>
  1103. </para>
  1104. </listitem>
  1105. <listitem>
  1106. <para>
  1107. <methodname>getAllowEmpty()</methodname>
  1108. </para>
  1109. </listitem>
  1110. <listitem>
  1111. <para>
  1112. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  1113. </para>
  1114. </listitem>
  1115. <listitem>
  1116. <para>
  1117. <methodname>autoInsertNotEmptyValidator()</methodname>
  1118. </para>
  1119. </listitem>
  1120. <listitem>
  1121. <para>
  1122. <methodname>setIgnore($flag)</methodname>
  1123. </para>
  1124. </listitem>
  1125. <listitem>
  1126. <para>
  1127. <methodname>getIgnore()</methodname>
  1128. </para>
  1129. </listitem>
  1130. <listitem>
  1131. <para>
  1132. <methodname>getType()</methodname>
  1133. </para>
  1134. </listitem>
  1135. <listitem>
  1136. <para>
  1137. <methodname>setAttrib($name, $value)</methodname>
  1138. </para>
  1139. </listitem>
  1140. <listitem>
  1141. <para>
  1142. <methodname>setAttribs(array $attribs)</methodname>
  1143. </para>
  1144. </listitem>
  1145. <listitem>
  1146. <para>
  1147. <methodname>getAttrib($name)</methodname>
  1148. </para>
  1149. </listitem>
  1150. <listitem>
  1151. <para>
  1152. <methodname>getAttribs()</methodname>
  1153. </para>
  1154. </listitem>
  1155. </itemizedlist>
  1156. </listitem>
  1157. <listitem>
  1158. <para>Cargadores y rutas de plugin:</para>
  1159. <itemizedlist>
  1160. <listitem>
  1161. <para>
  1162. <methodname>setPluginLoader(Zend_Loader_PluginLoader_Interface
  1163. $loader, $type)</methodname>
  1164. </para>
  1165. </listitem>
  1166. <listitem>
  1167. <para>
  1168. <methodname>getPluginLoader($type)</methodname>
  1169. </para>
  1170. </listitem>
  1171. <listitem>
  1172. <para>
  1173. <methodname>addPrefixPath($prefix, $path, $type =
  1174. null)</methodname>
  1175. </para>
  1176. </listitem>
  1177. <listitem>
  1178. <para>
  1179. <methodname>addPrefixPaths(array $spec)</methodname>
  1180. </para>
  1181. </listitem>
  1182. </itemizedlist>
  1183. </listitem>
  1184. <listitem>
  1185. <para>Validación:</para>
  1186. <itemizedlist>
  1187. <listitem>
  1188. <para>
  1189. <methodname>addValidator($validator,
  1190. $breakChainOnFailure = false, $options =
  1191. array())</methodname>
  1192. </para>
  1193. </listitem>
  1194. <listitem>
  1195. <para>
  1196. <methodname>addValidators(array
  1197. $validators)</methodname>
  1198. </para>
  1199. </listitem>
  1200. <listitem>
  1201. <para>
  1202. <methodname>setValidators(array
  1203. $validators)</methodname>
  1204. </para>
  1205. </listitem>
  1206. <listitem>
  1207. <para>
  1208. <methodname>getValidator($name)</methodname>
  1209. </para>
  1210. </listitem>
  1211. <listitem>
  1212. <para>
  1213. <methodname>getValidators()</methodname>
  1214. </para>
  1215. </listitem>
  1216. <listitem>
  1217. <para>
  1218. <methodname>removeValidator($name)</methodname>
  1219. </para>
  1220. </listitem>
  1221. <listitem>
  1222. <para>
  1223. <methodname>clearValidators()</methodname>
  1224. </para>
  1225. </listitem>
  1226. <listitem>
  1227. <para>
  1228. <methodname>isValid($value, $context =
  1229. null)</methodname>
  1230. </para>
  1231. </listitem>
  1232. <listitem>
  1233. <para>
  1234. <methodname>getErrors()</methodname>
  1235. </para>
  1236. </listitem>
  1237. <listitem>
  1238. <para>
  1239. <methodname>getMessages()</methodname>
  1240. </para>
  1241. </listitem>
  1242. </itemizedlist>
  1243. </listitem>
  1244. <listitem>
  1245. <para>Filtros:</para>
  1246. <itemizedlist>
  1247. <listitem>
  1248. <para>
  1249. <methodname>addFilter($filter, $options =
  1250. array())</methodname>
  1251. </para>
  1252. </listitem>
  1253. <listitem>
  1254. <para>
  1255. <methodname>addFilters(array $filters)</methodname>
  1256. </para>
  1257. </listitem>
  1258. <listitem>
  1259. <para>
  1260. <methodname>setFilters(array $filters)</methodname>
  1261. </para>
  1262. </listitem>
  1263. <listitem>
  1264. <para>
  1265. <methodname>getFilter($name)</methodname>
  1266. </para>
  1267. </listitem>
  1268. <listitem>
  1269. <para>
  1270. <methodname>getFilters()</methodname>
  1271. </para>
  1272. </listitem>
  1273. <listitem>
  1274. <para>
  1275. <methodname>removeFilter($name)</methodname>
  1276. </para>
  1277. </listitem>
  1278. <listitem>
  1279. <para>
  1280. <methodname>clearFilters()</methodname>
  1281. </para>
  1282. </listitem>
  1283. </itemizedlist>
  1284. </listitem>
  1285. <listitem>
  1286. <para>Generación:</para>
  1287. <itemizedlist>
  1288. <listitem>
  1289. <para>
  1290. <methodname>setView(Zend_View_Interface $view =
  1291. null)</methodname>
  1292. </para>
  1293. </listitem>
  1294. <listitem>
  1295. <para>
  1296. <methodname>getView()</methodname>
  1297. </para>
  1298. </listitem>
  1299. <listitem>
  1300. <para>
  1301. <methodname>addDecorator($decorator, $options =
  1302. null)</methodname>
  1303. </para>
  1304. </listitem>
  1305. <listitem>
  1306. <para>
  1307. <methodname>addDecorators(array
  1308. $decorators)</methodname>
  1309. </para>
  1310. </listitem>
  1311. <listitem>
  1312. <para>
  1313. <methodname>setDecorators(array
  1314. $decorators)</methodname>
  1315. </para>
  1316. </listitem>
  1317. <listitem>
  1318. <para>
  1319. <methodname>getDecorator($name)</methodname>
  1320. </para>
  1321. </listitem>
  1322. <listitem>
  1323. <para>
  1324. <methodname>getDecorators()</methodname>
  1325. </para>
  1326. </listitem>
  1327. <listitem>
  1328. <para>
  1329. <methodname>removeDecorator($name)</methodname>
  1330. </para>
  1331. </listitem>
  1332. <listitem>
  1333. <para>
  1334. <methodname>clearDecorators()</methodname>
  1335. </para>
  1336. </listitem>
  1337. <listitem>
  1338. <para>
  1339. <methodname>render(Zend_View_Interface $view =
  1340. null)</methodname>
  1341. </para>
  1342. </listitem>
  1343. </itemizedlist>
  1344. </listitem>
  1345. </itemizedlist>
  1346. </sect2>
  1347. <sect2 id="zend.form.elements.config">
  1348. <title>Configuración</title>
  1349. <para> El constructor de <classname>Zend_Form_Element</classname> acepta
  1350. tanto una matriz de opciones como un objeto
  1351. <classname>Zend_Config</classname> conteniendo opciones, y esto
  1352. puede configurarse usando <methodname>setOptions()</methodname> o
  1353. <methodname>setConfig()</methodname> . Hablando de manera
  1354. general, las claves son nombradas de la siguiente manera: </para>
  1355. <itemizedlist>
  1356. <listitem>
  1357. <para> Si 'set' + clave se refiere a un método de
  1358. <classname>Zend_Form_Element</classname> , entonces el
  1359. valor provisto será pasado a el método. </para>
  1360. </listitem>
  1361. <listitem>
  1362. <para>De otra manera, el valor será usado para establecer un
  1363. atributo.</para>
  1364. </listitem>
  1365. </itemizedlist>
  1366. <para>Excepciones a la regla incluyen las siguientes:</para>
  1367. <itemizedlist>
  1368. <listitem>
  1369. <para>
  1370. <methodname>prefixPath</methodname> será pasado a
  1371. <methodname>addPrefixPaths()</methodname>
  1372. </para>
  1373. </listitem>
  1374. <listitem>
  1375. <para>Los siguientes setters no pueden establecerse de esta
  1376. manera:</para>
  1377. <itemizedlist>
  1378. <listitem>
  1379. <para>
  1380. <methodname>setAttrib</methodname> (aunque
  1381. <methodname>setAttribs</methodname>
  1382. <emphasis>funcionará</emphasis>
  1383. </para>
  1384. </listitem>
  1385. <listitem>
  1386. <para>
  1387. <methodname>setConfig</methodname>
  1388. </para>
  1389. </listitem>
  1390. <listitem>
  1391. <para>
  1392. <methodname>setOptions</methodname>
  1393. </para>
  1394. </listitem>
  1395. <listitem>
  1396. <para>
  1397. <methodname>setPluginLoader</methodname>
  1398. </para>
  1399. </listitem>
  1400. <listitem>
  1401. <para>
  1402. <methodname>setTranslator</methodname>
  1403. </para>
  1404. </listitem>
  1405. <listitem>
  1406. <para>
  1407. <methodname>setView</methodname>
  1408. </para>
  1409. </listitem>
  1410. </itemizedlist>
  1411. </listitem>
  1412. </itemizedlist>
  1413. <para>Como ejemplo, aquí esta un archivo de configuración pasado para
  1414. cada tipo de dato configurable:</para>
  1415. <programlisting language="ini"><![CDATA[
  1416. [element]
  1417. name = "foo"
  1418. value = "foobar"
  1419. label = "Foo:"
  1420. order = 10
  1421. required = true
  1422. allowEmpty = false
  1423. autoInsertNotEmptyValidator = true
  1424. description = "Foo elements are for examples"
  1425. ignore = false
  1426. attribs.id = "foo"
  1427. attribs.class = "element"
  1428. ; sets 'onclick' attribute
  1429. onclick = "autoComplete(this, '/form/autocomplete/element')"
  1430. prefixPaths.decorator.prefix = "My_Decorator"
  1431. prefixPaths.decorator.path = "My/Decorator/"
  1432. disableTranslator = 0
  1433. validators.required.validator = "NotEmpty"
  1434. validators.required.breakChainOnFailure = true
  1435. validators.alpha.validator = "alpha"
  1436. validators.regex.validator = "regex"
  1437. validators.regex.options.pattern = "/^[A-F].*/$"
  1438. filters.ucase.filter = "StringToUpper"
  1439. decorators.element.decorator = "ViewHelper"
  1440. decorators.element.options.helper = "FormText"
  1441. decorators.label.decorator = "Label"
  1442. ]]></programlisting>
  1443. </sect2>
  1444. <sect2 id="zend.form.elements.custom">
  1445. <title>Elementos personalizados</title>
  1446. <para> Usted puede crear sus propios elementos personalizados
  1447. simplemente extendiendo la clase
  1448. <classname>Zend_Form_Element</classname> . Las razones comunes
  1449. para hacer esto incluyen: </para>
  1450. <itemizedlist>
  1451. <listitem>
  1452. <para>Elementos que comparten validadores y/o filtros comunes
  1453. </para>
  1454. </listitem>
  1455. <listitem>
  1456. <para>Elementos que tienen decoradores con funcionalidad
  1457. personalizada</para>
  1458. </listitem>
  1459. </itemizedlist>
  1460. <para> Hay dos métodos típicamente usados para extender un elemento:
  1461. <methodname>init()</methodname> , el cual puede usarse para
  1462. añadir una lógica de inicialización personalizada a su elemento, y
  1463. <methodname>loadDefaultDecorators()</methodname> , el cual puede
  1464. usarse para establecer una lista de decoradores usados por su
  1465. elemento de manera predeterminada. </para>
  1466. <para> Como un ejemplo, digamos que todos los elementos de tipo texto en
  1467. un formulario que está creando, necesitan ser filtrados con
  1468. <methodname>StringTrim</methodname> , validados con una
  1469. expresión regular, y que quiere usar un decorador personalizado que
  1470. ha creado para mostrarlos, 'My_Decorator_TextItem'; adicionalmente,
  1471. tiene un número de atributos estándars, incluyendo 'size',
  1472. 'maxLength', y 'class' que quisiera especificar. Puede definir un
  1473. elemento tal como sigue: </para>
  1474. <programlisting language="php"><![CDATA[
  1475. class My_Element_Text extends Zend_Form_Element
  1476. {
  1477. public function init()
  1478. {
  1479. $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator')
  1480. ->addFilters('StringTrim')
  1481. ->addValidator('Regex', false, array('/^[a-z0-9]{6,}$/i'))
  1482. ->addDecorator('TextItem')
  1483. ->setAttrib('size', 30)
  1484. ->setAttrib('maxLength', 45)
  1485. ->setAttrib('class', 'text');
  1486. }
  1487. }
  1488. ]]></programlisting>
  1489. <para>Entonces puede informar a su objeto formulario acerca del prefijo
  1490. de ruta para elementos de ese tipo, y comenzar creando
  1491. elementos:</para>
  1492. <programlisting language="php"><![CDATA[
  1493. $form->addPrefixPath('My_Element', 'My/Element/', 'element')
  1494. ->addElement('foo', 'text');
  1495. ]]></programlisting>
  1496. <para> El elemento 'foo' será ahora del tipo
  1497. <methodname>My_Element_Text</methodname> , y mostrará el
  1498. comportamiento que ha especificado. </para>
  1499. <para> Otro método que puede querer sobreescribir cuando extienda
  1500. <classname>Zend_Form_Element</classname> es el método
  1501. <methodname>loadDefaultDecorators()</methodname> . Este método
  1502. carga condicionalmente un grupo de decoradores predefinidos para su
  1503. elemento; puede querer sustituir su propio decorador en su clase
  1504. extendida: </para>
  1505. <programlisting language="php"><![CDATA[
  1506. class My_Element_Text extends Zend_Form_Element
  1507. {
  1508. public function loadDefaultDecorators()
  1509. {
  1510. $this->addDecorator('ViewHelper')
  1511. ->addDecorator('DisplayError')
  1512. ->addDecorator('Label')
  1513. ->addDecorator('HtmlTag',
  1514. array('tag' => 'div', 'class' => 'element'));
  1515. }
  1516. }
  1517. ]]></programlisting>
  1518. <para> Hay muchas maneras de personalizar elementos; asegúrese de leer
  1519. la documentación de la <acronym>API</acronym> de
  1520. <classname>Zend_Form_Element</classname> para conocer todos los
  1521. métodos disponibles. </para>
  1522. </sect2>
  1523. </sect1>