Zend_Validate.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19577 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.introduction">
  5. <title>Introducción</title>
  6. <para>
  7. Cuando se necesita validar algún tipo de dato, el componente <classname>Zend_Validate</classname>
  8. ofrece un conjunto de validadores,
  9. como así también un sencillo mecanismo de encadenado de validaciones por el cual
  10. múltiples validadores pueden aplicarse a un dato en un orden definido por el usuario.
  11. </para>
  12. <sect2 id="zend.validate.introduction.definition">
  13. <title>¿Qué es un validador?</title>
  14. <para>
  15. Un validador examina su entrada con respecto a algunos requerimientos
  16. y produce un resultado booleano si la entrada valida satisfactoriamente
  17. con los requisitos. Si la entrada no cumple los requisitos,
  18. un validador también podrá proporcionar información adicional
  19. sobre que requisito(s) no son satisfechos.
  20. </para>
  21. <para>
  22. Por ejemplo, una aplicación web podría requerir que un usuario ingrese
  23. su nombre, de entre seis y doce caracteres de longitud y
  24. que sólo puede contener caracteres alfanuméricos.
  25. Se puede usar un validador para asegurar que los usuarios cumplan
  26. estos requisitos.
  27. Si el nombre de usuario elegido no cumple con uno o ambos de los requisitos,
  28. sería útil saber cuál de estos requisitos no se cumple.
  29. </para>
  30. </sect2>
  31. <sect2 id="zend.validate.introduction.using">
  32. <title>Uso básico de validadores</title>
  33. <para>
  34. Habiendo definido la validación de esta manera, Zend Framework nos proporciona el fundamento
  35. para <classname>Zend_Validate_Interface</classname> que define dos métodos,
  36. <methodname>isValid()</methodname> y <methodname>getMessages()</methodname>.
  37. El método <methodname>isValid()</methodname> realiza la validación del valor,
  38. devolviendo <constant>TRUE</constant> si y sólo si el valor pasa contra el criterio de
  39. validación.
  40. </para>
  41. <para>
  42. Si <methodname>isValid()</methodname> devuelve <constant>FALSE</constant>, la función
  43. <methodname>getMessages()</methodname> devuelve un array de mensajes explicando
  44. el motivo(s) del fracaso de la validación. Las claves del array son
  45. strings cortos que identifican las razones por las cuales fracasó
  46. la validación, y los valores del array son los correspondientes mensajes
  47. para ser leídos por un ser humano.
  48. Las claves y los valores son dependientes de la clase; cada clase de validación
  49. define su propio conjunto de mensajes de validación fallidas y las
  50. claves únicas que las identifican.
  51. Cada clase tiene también una definición constante
  52. que hace corresponder a cada identificador con una causa del fallo
  53. de validación.
  54. </para>
  55. <note>
  56. <para>
  57. El método <methodname>getMessages()</methodname> devuelve información del fracaso
  58. de la validación sólo para la llamada más reciente a <methodname>isValid()</methodname>.
  59. Cada llamada a <methodname>isValid()</methodname> borra los mensajes y errores
  60. causados por una llamada anterior <methodname>isValid()</methodname>, porque es
  61. probable que cada llamada a <methodname>isValid()</methodname> se refiera al valor de una entrada diferente.
  62. </para>
  63. </note>
  64. <para>
  65. El siguiente ejemplo ilustra la validación de una dirección de e-mail:
  66. </para>
  67. <programlisting language="php"><![CDATA[
  68. $validator = new Zend_Validate_EmailAddress();
  69. if ($validator->isValid($email)) {
  70. // email parece ser válido
  71. } else {
  72. // email es inválido; muestre la razones
  73. foreach ($validator->getMessages() as $messageId => $message) {
  74. echo "Falla de validación '$messageId': $message\n";
  75. }
  76. }
  77. ]]></programlisting>
  78. </sect2>
  79. <sect2 id="zend.validate.introduction.messages">
  80. <title>Personalizar los mensajes</title>
  81. <para>
  82. Para validar las clases se proporciona un método <methodname>setMessage()</methodname>
  83. con el que se puede especificar el formato de un mensaje devuelto por
  84. <methodname>getMessages()</methodname> en caso de fallo de validación.
  85. El primer argumento de este método es un string que contiene el mensaje
  86. de error. Usted puede incluir tokens en este array que serán sustituidos
  87. con datos relevantes al validador. El token <emphasis>%value%</emphasis> es aceptado
  88. por todos los validadores, que es sustituido por el valor que pasó a
  89. <methodname>isValid()</methodname>. Cada clase de validación, puede dar apoyo a otros
  90. tokens en base a cada caso. Por ejemplo, <emphasis>%max%</methodname> es un token
  91. apoyado por <classname>Zend_Validate_LessThan</classname>.
  92. El método <methodname>getMessageVariables()</methodname> devuelve un array de tokens
  93. variables aceptados por el validador.
  94. </para>
  95. <para>
  96. El segundo argumento opcional es un string que identifica la plantilla
  97. de mensajes que se establecerá en caso del fracaso de la validación,
  98. lo que es útil cuando una clase de validación define más de una causa para
  99. el fallo.
  100. Si omite el segundo argumento, <methodname>setMessage()</methodname> asume que el
  101. mensaje que especifique debe ser utilizado por la plantilla del
  102. primer mensaje que declaró en la clase de validación.
  103. Muchas clases de validación sólo definen una plantilla de mensaje de
  104. error, así que no hay necesidad de especificar el cambio de plantilla
  105. de mensaje.
  106. </para>
  107. <para>
  108. <programlisting language="php"><![CDATA[
  109. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  110. $validator->setMessage(
  111. 'El string \'%value%\' es muy corto; debe tener al menos %min% ' .
  112. 'caracteres',
  113. Zend_Validate_StringLength::TOO_SHORT);
  114. if (!$validator->isValid('word')) {
  115. $messages = $validator->getMessages();
  116. echo current($messages);
  117. // "El string 'word' es muy corto; debe tener al menos 8 caracteres"
  118. }
  119. ]]></programlisting>
  120. </para>
  121. <para>
  122. Puede establecer varios mensajes usando el método <methodname>setMessages()</methodname>.
  123. Su argumento es un array que contiene pares de clave/mensaje.
  124. </para>
  125. <programlisting language="php"><![CDATA[
  126. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  127. $validator->setMessages( array(
  128. Zend_Validate_StringLength::TOO_SHORT =>
  129. 'El string \'%value%\' es muy corto',
  130. Zend_Validate_StringLength::TOO_LONG =>
  131. 'El string \'%value%\' es muy largo'
  132. ));
  133. ]]></programlisting>
  134. <para>
  135. Incluso, si su aplicación requiere una mayor flexibilidad para informar
  136. los fallos de validación, puede acceder a las propiedades por el
  137. mismo nombre, tal como los tokens de mensajes apoyados por una determinada
  138. clase de validación.
  139. La propiedad <methodname>value</methodname> siempre está disponible en un validador;
  140. es el valor que especificó en el argumento de <methodname>isValid()</methodname>.
  141. En cada clase de validación se puede dar apoyo a otras propiedades
  142. basándose en el esquema de caso por caso.
  143. <programlisting language="php"><![CDATA[
  144. $validator = new Zend_Validate_StringLength(8, 12);
  145. if (!validator->isValid('word')) {
  146. echo 'Palabra fallada: '
  147. . $validator->value
  148. . '; su longitud no está entre '
  149. . $validator->min
  150. . ' y '
  151. . $validator->max
  152. . "\n";
  153. }
  154. ]]></programlisting>
  155. </para>
  156. </sect2>
  157. <sect2 id="zend.validate.introduction.static">
  158. <title>Utilizando el método estático <methodname>is()</methodname> </title>
  159. <para>
  160. Si es inconveniente cargar una clase de validación y crear una
  161. instancia del validador, puede usar el método estático
  162. <methodname>Zend_Validate::is()</methodname> como un estilo alternativo de invocación.
  163. El primer argumento de este método es el valor de una entrada de datos
  164. que usted pasaría al método <methodname>isValid()</methodname>.
  165. El segundo argumento es un string, que corresponde al nombre base
  166. de la clase de validación, relativo al nombre de espacio <classname>Zend_Validate</classname>.
  167. El método <methodname>is()</methodname> carga automáticamente la clase, crea una
  168. instancia y aplica el método <methodname>isValid()</methodname> a la entrada de datos.
  169. <programlisting language="php"><![CDATA[
  170. if (Zend_Validate::is($email, 'EmailAddress')) {
  171. // Si, el email parece ser válido
  172. }
  173. ]]></programlisting>
  174. </para>
  175. <para>
  176. Si el validador lo necesita, también puede pasar un array de constructores de argumentos.
  177. <programlisting language="php"><![CDATA[
  178. if (Zend_Validate::is($value, 'Between', array('min' => 1, 'max' => 12))) {
  179. // Si, $value está entre 1 y 12
  180. }
  181. ]]></programlisting>
  182. </para>
  183. <para>
  184. El método <methodname>is()</methodname> devuelve un valor booleano, lo mismo que
  185. el método <methodname>isValid()</methodname>. Cuando se utiliza el método estático
  186. <methodname>is()</methodname>, no están disponibles los mensajes de fracaso de
  187. validación.
  188. </para>
  189. <para>
  190. El uso estático puede ser conveniente para invocar un validador ad-hoc
  191. (hecho especialmente), pero si tiene la necesidad de ejecutar el validador para múltiples
  192. entradas, es más eficiente usar métodos no estáticos, creando una
  193. instancia del objeto validador y llamando a su método <methodname>isValid()</methodname>.
  194. </para>
  195. <para>
  196. También la clase <classname>Zend_Filter_Input</classname> le permite crear
  197. ejemplos y ejecutar múltiples filtros y clases de validadores por
  198. demanda, para procesar juegos de datos de entrada. Ver
  199. <xref linkend="zend.filter.input" />.
  200. </para>
  201. <sect3 id="zend.validate.introduction.static.namespaces">
  202. <title>Namespaces</title>
  203. <para>
  204. When working with self defined validators you can give a forth parameter
  205. to <methodname>Zend_Validate::is()</methodname> which is the namespace
  206. where your validator can be found.
  207. </para>
  208. <programlisting language="php"><![CDATA[
  209. if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12),
  210. array('FirstNamespace', 'SecondNamespace')) {
  211. // Yes, $value is ok
  212. }
  213. ]]></programlisting>
  214. <para>
  215. <classname>Zend_Validate</classname> allows also to set namespaces as default.
  216. This means that you can set them once in your bootstrap and have not to give
  217. them again for each call of <methodname>Zend_Validate::is()</methodname>. The
  218. following code snippet is identical to the above one.
  219. </para>
  220. <programlisting language="php"><![CDATA[
  221. Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
  222. if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12)) {
  223. // Yes, $value is ok
  224. }
  225. if (Zend_Validate::is($value, 'OtherValidator', array('min' => 1, 'max' => 12)) {
  226. // Yes, $value is ok
  227. }
  228. ]]></programlisting>
  229. <para>
  230. For your convinience there are following methods which allow the handling of
  231. namespaces:
  232. </para>
  233. <itemizedlist>
  234. <listitem>
  235. <para>
  236. <emphasis><methodname>Zend_Validate::getDefaultNamespaces()</methodname></emphasis>:
  237. Returns all set default namespaces as array.
  238. </para>
  239. </listitem>
  240. <listitem>
  241. <para>
  242. <emphasis><methodname>Zend_Validate::setDefaultNamespaces()</methodname></emphasis>:
  243. Sets new default namespaces and overrides any previous set. It accepts
  244. either a string for a single namespace of an array for multiple namespaces.
  245. </para>
  246. </listitem>
  247. <listitem>
  248. <para>
  249. <emphasis><methodname>Zend_Validate::addDefaultNamespaces()</methodname></emphasis>:
  250. Adds additional namespaces to already set ones. It accepts either a string
  251. for a single namespace of an array for multiple namespaces.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. <emphasis><methodname>Zend_Validate::hasDefaultNamespaces()</methodname></emphasis>:
  257. Returns true when one or more default namespaces are set, and false when no
  258. default namespaces are set.
  259. </para>
  260. </listitem>
  261. </itemizedlist>
  262. </sect3>
  263. </sect2>
  264. <sect2 id="zend.validate.introduction.translation">
  265. <title>Translating messages</title>
  266. <para>
  267. Validate classes provide a <methodname>setTranslator()</methodname> method with
  268. which you can specify a instance of <classname>Zend_Translate</classname> which
  269. will translate the messages in case of a validation failure. The
  270. <methodname>getTranslator()</methodname> method returns the set translator instance.
  271. </para>
  272. <programlisting language="php"><![CDATA[
  273. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  274. $translate = new Zend_Translate(
  275. 'array',
  276. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  277. 'en'
  278. );
  279. $validator->setTranslator($translate);
  280. ]]></programlisting>
  281. <para>
  282. With the static <methodname>setDefaultTranslator()</methodname> method you can set
  283. a instance of <classname>Zend_Translate</classname> which will be used for all
  284. validation classes, and can be retrieved with <methodname>getDefaultTranslator()</methodname>.
  285. This prevents you from setting a translator manually for all validator classes,
  286. and simplifies your code.
  287. </para>
  288. <programlisting language="php"><![CDATA[
  289. $translate = new Zend_Translate(
  290. 'array',
  291. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  292. 'en'
  293. );
  294. Zend_Validate::setDefaultTranslator($translate);
  295. ]]></programlisting>
  296. <note>
  297. <para>
  298. When you have set an application wide locale within your registry, then this
  299. locale will be used as default translator.
  300. </para>
  301. </note>
  302. <para>
  303. Sometimes it is necessary to disable the translator within a validator.
  304. To archive this you can use the <methodname>setDisableTranslator()</methodname> method,
  305. which accepts a boolean parameter, and <methodname>translatorIsDisabled()</methodname>
  306. to get the set value.
  307. </para>
  308. <programlisting language="php"><![CDATA[
  309. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  310. if (!$validator->isTranslatorDisabled()) {
  311. $validator->setDisableTranslator();
  312. }
  313. ]]></programlisting>
  314. <para>
  315. It is also possible to use a translator instead of setting own messages with
  316. <methodname>setMessage()</methodname>. But doing so, you should keep in mind, that the
  317. translator works also on messages you set your own.
  318. </para>
  319. </sect2>
  320. </sect1>
  321. <!--
  322. vim:se ts=4 sw=4 et:
  323. -->