Zend_Validate.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.introduction">
  5. <title>Introduction</title>
  6. <para>
  7. Le composant <classname>Zend_Validate</classname> fournit un ensemble de validateurs
  8. usuels. Il fournit également un mécanisme simple de chaînage permettant d'appliquer de
  9. multiples validateurs à une donnée dans un ordre défini par l'utilisateur.
  10. </para>
  11. <sect2 id="zend.validate.introduction.definition">
  12. <title>Qu'est-ce qu'un validateur ?</title>
  13. <para>
  14. Un validateur examine ce qui lui est soumis suivant certaines règles et retourne
  15. un résultat booléen, si la donnée est conforme aux exigences. Si ce n'est pas le cas, un
  16. validateur peut de manière optionnelle fournir des informations concernant la (ou les)
  17. règle(s) non remplie(s).
  18. </para>
  19. <para>
  20. Par exemple, une application Web peut réclamer qu'un identifiant comprennent entre
  21. six et douze caractères et ne contiennent que des caractères alphanumériques. Un
  22. validateur peut être utilisé pour s'assurer que les identifiants remplissent ces règles.
  23. Si un identifiant donné ne respecte pas l'une ou plusieurs de ces règles, il sera utile
  24. de savoir laquelle ou lesquelles en particulier.
  25. </para>
  26. </sect2>
  27. <sect2 id="zend.validate.introduction.using">
  28. <title>Utilisation basique des validateurs</title>
  29. <para>
  30. Avoir défini la validation de cette manière fournit la fondation de
  31. <classname>Zend_Validate_Interface</classname>, qui définit deux méthodes,
  32. <methodname>isValid()</methodname> et <methodname>getMessages()</methodname>. La méthode <methodname>isValid()</methodname>
  33. réalise la validation sur la valeur fournie, en retournant <constant>TRUE</constant> si et
  34. seulement si la valeur respecte les critères de validation.
  35. </para>
  36. <para>
  37. Si <methodname>isValid()</methodname> retourne <constant>FALSE</constant>, <methodname>getMessages()</methodname>
  38. retourne un tableau de messages expliquant la(es) raison(s) de l'échec de la validation.
  39. Les clés du tableau sont des chaînes courtes qui identifient les raisons de l'échec de
  40. la validation, et les valeurs du tableau sont les chaînes de messages humainement
  41. lisibles correspondantes. Les clés et les valeurs sont dépendantes de la classe ; chaque
  42. classe de validation définit son propre jeu de messages d'échec de validation et les
  43. clés uniques qui les identifient. Chaque classe possède aussi une définition de
  44. constantes ("<code>const</code>") qui rattachent tout identificateur à une cause d'échec
  45. de validation.
  46. </para>
  47. <para>
  48. La méthode <methodname>getErrors()</methodname> retourne un tableau d'informations courtes qui
  49. identifient la(es) raison(s) de l'échec de la validation. Ces chaînes sont fournies pour
  50. identifier les erreurs. Elles sont destinées à votre code d'application, et non à être
  51. affichées pour l'utilisateur. Ces chaînes sont dépendantes de la classe ; chaque classe
  52. de validation définit ces propres chaînes pour identifier la cause des erreurs. Chaque
  53. classe fournit de plus des constantes (<code>const</code>) qui correspondent aux
  54. identificateurs d'erreur.
  55. </para>
  56. <note>
  57. <para>
  58. La méthode <methodname>getMessages()</methodname> retourne des informations sur l'échec de
  59. validation seulement pour l'appel le plus récent de <methodname>isValid()</methodname>. Chaque
  60. appel de <methodname>isValid()</methodname> efface les messages et les erreurs déclenchées par
  61. l'appel précédent, car il est probable que chaque appel de <methodname>isValid()</methodname>
  62. est réalisé pour des données d'entrée différentes.
  63. </para>
  64. </note>
  65. <para>
  66. L'exemple suivant illustre la validation d'une adresse mail : <programlisting
  67. role="php"><![CDATA[
  68. $validator = new Zend_Validate_EmailAddress();
  69. if ($validator->isValid($email)) {
  70. // l'email est valide
  71. } else {
  72. // l'email est invalide ; affichons pourquoi
  73. foreach ($validator->getMessages() as $messageId => $message) {
  74. echo "Echec de validation '$messageId' : $message\n";
  75. }
  76. }
  77. ]]></programlisting></para>
  78. </sect2>
  79. <sect2 id="zend.validate.introduction.messages">
  80. <title>Messages personnalisés</title>
  81. <para>
  82. Les classes de validation fournissent une méthode <methodname>setMessage()</methodname> avec
  83. laquelle vous pouvez spécifier le format du message retourné par
  84. <methodname>getMessages()</methodname> dans le cas d'un échec de validation. Le premier argument de
  85. cette méthode est une chaîne contenant le message d'erreur. Vous pouvez inclure des
  86. balises dans cette chaîne qui seront substituées avec les données appropriées du
  87. validateur. La balise <code>%value%</code> est supportée par tous les validateurs ; elle
  88. est substituée par la valeur fournie à <methodname>isValid()</methodname>. D'autres balises peuvent
  89. être supportées aux cas par cas par chaque classe de validation. Par exemple,
  90. <code>%max%</code> est une balise supportée par
  91. <classname>Zend_Validate_LessThan</classname>. La méthode
  92. <methodname>getMessageVariables()</methodname> retourne un tableau des balises de variables
  93. supportées par le validateur.
  94. </para>
  95. <para>
  96. Le second paramètre optionnel est une chaîne qui identifie le modèle de message
  97. d'échec de validation qui doit être paramètré, ce qui est pratique quand une classe de
  98. validation définit plus d'une cause d'échec. Si vous omettez ce second argument,
  99. <methodname>setMessage()</methodname> considère que le message, que vous spécifiez, s'applique au
  100. premier message déclaré dans la classe de validation. La plupart des classes de
  101. validation n'ayant qu'un seul message d'erreur, il n'est pas nécessaire de spécifier
  102. distinctement dans ce cas quel message vous affectez.
  103. </para>
  104. <para>
  105. <programlisting language="php"><![CDATA[
  106. $validator = new Zend_Validate_StringLength(8);
  107. $validator->setMessage(
  108. 'La chaîne \'%value%\' est trop courte ; '
  109. . 'elle doit être au moins de %min% caractères',
  110. Zend_Validate_StringLength::TOO_SHORT);
  111. if (!$validator->isValid('word')) {
  112. $messages = $validator->getMessages();
  113. echo current($messages);
  114. // affiche "La chaîne 'word' est trop courte ;
  115. // elle doit être au moins de 8 caractères"
  116. }
  117. ]]></programlisting></para>
  118. <para>
  119. Vous pouvez régler des messages multiples en utilisant la méthode
  120. <methodname>setMessages()</methodname>. Son argument dans ce cas est un tableau de paires
  121. clé/message. <programlisting language="php"><![CDATA[
  122. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  123. $validator->setMessages( array(
  124. Zend_Validate_StringLength::TOO_SHORT =>
  125. 'La chaîne \'%value%\' est trop courte',
  126. Zend_Validate_StringLength::TOO_LONG =>
  127. 'La chaîne \'%value%\' est trop longue'
  128. ));
  129. ]]></programlisting></para>
  130. <para>
  131. Si votre application exige une flexibilité encore plus grande avec laquelle elle
  132. rapporte les échecs de validation, vous pouvez accéder aux propriétés par le même nom
  133. que les balises de message supportées par une classe de validation donnée. La propriété
  134. <code>value</code> est toujours accessible dans un validateur ; il s'agit de la valeur
  135. fournie comme argument à <methodname>isValid()</methodname>. D'autres propriétés peuvent être
  136. supportées au cas par cas par chaque classe de validation. <programlisting
  137. role="php"><![CDATA[
  138. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  139. if (!validator->isValid('word')) {
  140. echo 'Echec du mot : '
  141. . $validator->value
  142. . ' ; sa longueur n\'est pas compris entre '
  143. . $validator->min
  144. . ' et '
  145. . $validator->max
  146. . "\n";
  147. }
  148. ]]></programlisting></para>
  149. </sect2>
  150. <sect2 id="zend.validate.introduction.static">
  151. <title>Utilisation de la méthode statique <methodname>is()</methodname></title>
  152. <para>
  153. S'il est peu pratique de charger une classe de validation donnée et créer une
  154. instance de validateur, vous pouvez utiliser la méthode statique
  155. <methodname>Zend_Validate::is()</methodname> comme appel alternatif. Le premier argument
  156. de cette méthode est la donnée d'entrée, que vous passeriez à la méthode
  157. <methodname>isValid()</methodname>. Le deuxième argument est une chaîne, qui correspond au nom de
  158. base de la classe de validation, relativement dans l'espace de noms
  159. <classname>Zend_Validate</classname>. La méthode <methodname>is()</methodname> charge
  160. automatiquement la classe, crée une instance et applique la méthode
  161. <methodname>isValid()</methodname> à la donnée d'entrée. <programlisting language="php"><![CDATA[
  162. if (Zend_Validate::is($email, 'EmailAddress')) {
  163. // l'email est valide
  164. }
  165. ]]></programlisting></para>
  166. <para>
  167. Vous pouvez aussi fournir un tableau de paramètres destinés au constructeur de la
  168. classe, s'ils sont nécessaires pour votre classe de validation. <programlisting
  169. role="php"><![CDATA[
  170. if (Zend_Validate::is($value,
  171. 'Between',
  172. array(array('min' => 1, 'max' => 12)))) {
  173. // $value est compris entre 1 et 12
  174. }
  175. ]]></programlisting></para>
  176. <para>
  177. La méthode <methodname>is()</methodname> retourne une valeur booléenne, la même que la méthode
  178. <methodname>isValid()</methodname>. Lors de l'utilisation de la méthode statique <methodname>is()</methodname>,
  179. les messages d'échec de validation ne sont pas disponibles.
  180. </para>
  181. <para>
  182. L'utilisation statique peut être pratique pour invoquer un validateur ad hoc, mais
  183. si vous avez besoin d'exécuter un validateur pour des données multiples, il est plus
  184. efficace de suivre le premier exemple ci-dessus, créant une instance de l'objet de
  185. validation et appelant sa méthode <methodname>isValid()</methodname>.
  186. </para>
  187. <para>
  188. De plus, la classe <classname>Zend_Filter_Input</classname> vous permet
  189. d'instancier et d'exécuter des filtres multiples et des classes de validateurs sur
  190. demande pour traiter l'ensemble de données saisies. Voir
  191. <link linkend="zend.filter.input">Zend_Filter_Input</link>.
  192. </para>
  193. <sect3 id="zend.validate.introduction.static.namespaces">
  194. <title>Espaces de noms</title>
  195. <para>
  196. When working with self defined validators you can give a forth parameter
  197. to <methodname>Zend_Validate::is()</methodname> which is the namespace
  198. where your validator can be found.
  199. </para>
  200. <programlisting language="php"><![CDATA[
  201. if (Zend_Validate::is($value,
  202. 'MyValidator',
  203. array(array('min' => 1, 'max' => 12)),
  204. array('FirstNamespace', 'SecondNamespace')) {
  205. // Yes, $value is ok
  206. }
  207. ]]></programlisting>
  208. <para>
  209. <classname>Zend_Validate</classname> allows also to set namespaces as default.
  210. This means that you can set them once in your bootstrap and have not to give
  211. them again for each call of <methodname>Zend_Validate::is()</methodname>. The
  212. following code snippet is identical to the above one.
  213. </para>
  214. <programlisting language="php"><![CDATA[
  215. Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
  216. if (Zend_Validate::is($value,
  217. 'MyValidator',
  218. array(array('min' => 1, 'max' => 12))) {
  219. // Yes, $value is ok
  220. }
  221. if (Zend_Validate::is($value,
  222. 'OtherValidator',
  223. array('min' => 1, 'max' => 12)) {
  224. // Yes, $value is ok
  225. }
  226. ]]></programlisting>
  227. <para>
  228. For your convinience there are following methods which allow the handling of
  229. namespaces:
  230. </para>
  231. <itemizedlist>
  232. <listitem>
  233. <para>
  234. <emphasis><methodname>Zend_Validator::getDefaultNamespaces()</methodname></emphasis>:
  235. Returns all set default namespaces as array.
  236. </para>
  237. </listitem>
  238. <listitem>
  239. <para>
  240. <emphasis><methodname>Zend_Validator::setDefaultNamespaces()</methodname></emphasis>:
  241. Sets new default namespaces and overrides any previous set. It accepts
  242. eighter a string for a single namespace of an array for multiple namespaces.
  243. </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. <emphasis><methodname>Zend_Validator::addDefaultNamespaces()</methodname></emphasis>:
  248. Adds additional namespaces to already set ones. It accepts eighter a string
  249. for a single namespace of an array for multiple namespaces.
  250. </para>
  251. </listitem>
  252. <listitem>
  253. <para>
  254. <emphasis><methodname>Zend_Validator::hasDefaultNamespaces()</methodname></emphasis>:
  255. Returns true when one or more default namespaces are set, and false when no
  256. default namespaces are set.
  257. </para>
  258. </listitem>
  259. </itemizedlist>
  260. </sect3>
  261. </sect2>
  262. <sect2 id="zend.validate.introduction.translation">
  263. <title>Translating messages</title>
  264. <para>
  265. Validate classes provide a <methodname>setTranslator()</methodname> method with
  266. which you can specify a instance of <classname>Zend_Translate</classname> which
  267. will translate the messages in case of a validation failure. The
  268. <methodname>getTranslator()</methodname> method returns the set translator instance.
  269. </para>
  270. <programlisting language="php"><![CDATA[
  271. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  272. $translate = new Zend_Translate(
  273. array(
  274. 'adapter' => 'array',
  275. 'content' => array(
  276. Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''
  277. ),
  278. 'locale' => 'en'
  279. )
  280. );
  281. $validator->setTranslator($translate);
  282. ]]></programlisting>
  283. <para>
  284. With the static <methodname>setDefaultTranslator()</methodname> method you can set
  285. a instance of <classname>Zend_Translate</classname> which will be used for all
  286. validation classes, and can be retrieved with <methodname>getDefaultTranslator()</methodname>.
  287. This prevents you from setting a translator manually for all validator classes,
  288. and simplifies your code.
  289. </para>
  290. <programlisting language="php"><![CDATA[
  291. $translate = new Zend_Translate(
  292. array(
  293. 'adapter' => 'array',
  294. 'content' => array(
  295. Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''
  296. ),
  297. 'locale' => 'en'
  298. )
  299. );
  300. Zend_Validate::setDefaultTranslator($translate);
  301. ]]></programlisting>
  302. <note>
  303. <para>
  304. When you have set an application wide locale within your registry, then this
  305. locale will be used as default translator.
  306. </para>
  307. </note>
  308. <para>
  309. Sometimes it is necessary to disable the translator within a validator.
  310. To archive this you can use the <methodname>setDisableTranslator()</methodname> method,
  311. which accepts a boolean parameter, and <methodname>translatorIsDisabled()</methodname>
  312. to get the set value.
  313. </para>
  314. <programlisting language="php"><![CDATA[
  315. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  316. if (!$validator->isTranslatorDisabled()) {
  317. $validator->setDisableTranslator();
  318. }
  319. ]]></programlisting>
  320. <para>
  321. It is also possible to use a translator instead of setting own messages with
  322. <methodname>setMessage()</methodname>. But doing so, you should keep in mind, that the
  323. translator works also on messages you set your own.
  324. </para>
  325. </sect2>
  326. </sect1>