Zend_Form-Elements.xml 61 KB

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