Zend_Validate.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20799 -->
  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, 'Between', array(array('min' => 1, 'max' => 12)))) {
  171. // $value est compris entre 1 et 12
  172. }
  173. ]]></programlisting></para>
  174. <para>
  175. La méthode <methodname>is()</methodname> retourne une valeur booléenne, la même que la méthode
  176. <methodname>isValid()</methodname>. Lors de l'utilisation de la méthode statique <methodname>is()</methodname>,
  177. les messages d'échec de validation ne sont pas disponibles.
  178. </para>
  179. <para>
  180. L'utilisation statique peut être pratique pour invoquer un validateur ad hoc, mais
  181. si vous avez besoin d'exécuter un validateur pour des données multiples, il est plus
  182. efficace de suivre le premier exemple ci-dessus, créant une instance de l'objet de
  183. validation et appelant sa méthode <methodname>isValid()</methodname>.
  184. </para>
  185. <para>
  186. De plus, la classe <classname>Zend_Filter_Input</classname> vous permet
  187. d'instancier et d'exécuter des filtres multiples et des classes de validateurs sur
  188. demande pour traiter l'ensemble de données saisies. Voir <xref
  189. linkend="zend.filter.input" />.
  190. </para>
  191. <sect3 id="zend.validate.introduction.static.namespaces">
  192. <title>Espaces de noms</title>
  193. <para>
  194. When working with self defined validators you can give a forth parameter
  195. to <methodname>Zend_Validate::is()</methodname> which is the namespace
  196. where your validator can be found.
  197. </para>
  198. <programlisting language="php"><![CDATA[
  199. if (Zend_Validate::is($value, 'MyValidator', array(array('min' => 1, 'max' => 12)),
  200. array('FirstNamespace', 'SecondNamespace')) {
  201. // Yes, $value is ok
  202. }
  203. ]]></programlisting>
  204. <para>
  205. <classname>Zend_Validate</classname> allows also to set namespaces as default.
  206. This means that you can set them once in your bootstrap and have not to give
  207. them again for each call of <methodname>Zend_Validate::is()</methodname>. The
  208. following code snippet is identical to the above one.
  209. </para>
  210. <programlisting language="php"><![CDATA[
  211. Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
  212. if (Zend_Validate::is($value, 'MyValidator', array(array('min' => 1, 'max' => 12))) {
  213. // Yes, $value is ok
  214. }
  215. if (Zend_Validate::is($value, 'OtherValidator', array(array('min' => 1, 'max' => 12))) {
  216. // Yes, $value is ok
  217. }
  218. ]]></programlisting>
  219. <para>
  220. For your convinience there are following methods which allow the handling of
  221. namespaces:
  222. </para>
  223. <itemizedlist>
  224. <listitem>
  225. <para>
  226. <emphasis><methodname>Zend_Validator::getDefaultNamespaces()</methodname></emphasis>:
  227. Returns all set default namespaces as array.
  228. </para>
  229. </listitem>
  230. <listitem>
  231. <para>
  232. <emphasis><methodname>Zend_Validator::setDefaultNamespaces()</methodname></emphasis>:
  233. Sets new default namespaces and overrides any previous set. It accepts
  234. eighter a string for a single namespace of an array for multiple namespaces.
  235. </para>
  236. </listitem>
  237. <listitem>
  238. <para>
  239. <emphasis><methodname>Zend_Validator::addDefaultNamespaces()</methodname></emphasis>:
  240. Adds additional namespaces to already set ones. It accepts eighter a string
  241. for a single namespace of an array for multiple namespaces.
  242. </para>
  243. </listitem>
  244. <listitem>
  245. <para>
  246. <emphasis><methodname>Zend_Validator::hasDefaultNamespaces()</methodname></emphasis>:
  247. Returns true when one or more default namespaces are set, and false when no
  248. default namespaces are set.
  249. </para>
  250. </listitem>
  251. </itemizedlist>
  252. </sect3>
  253. </sect2>
  254. <sect2 id="zend.validate.introduction.translation">
  255. <title>Translating messages</title>
  256. <para>
  257. Validate classes provide a <methodname>setTranslator()</methodname> method with
  258. which you can specify a instance of <classname>Zend_Translate</classname> which
  259. will translate the messages in case of a validation failure. The
  260. <methodname>getTranslator()</methodname> method returns the set translator instance.
  261. </para>
  262. <programlisting language="php"><![CDATA[
  263. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  264. $translate = new Zend_Translate(
  265. 'array',
  266. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  267. 'en'
  268. );
  269. $validator->setTranslator($translate);
  270. ]]></programlisting>
  271. <para>
  272. With the static <methodname>setDefaultTranslator()</methodname> method you can set
  273. a instance of <classname>Zend_Translate</classname> which will be used for all
  274. validation classes, and can be retrieved with <methodname>getDefaultTranslator()</methodname>.
  275. This prevents you from setting a translator manually for all validator classes,
  276. and simplifies your code.
  277. </para>
  278. <programlisting language="php"><![CDATA[
  279. $translate = new Zend_Translate(
  280. 'array',
  281. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  282. 'en'
  283. );
  284. Zend_Validate::setDefaultTranslator($translate);
  285. ]]></programlisting>
  286. <note>
  287. <para>
  288. When you have set an application wide locale within your registry, then this
  289. locale will be used as default translator.
  290. </para>
  291. </note>
  292. <para>
  293. Sometimes it is necessary to disable the translator within a validator.
  294. To archive this you can use the <methodname>setDisableTranslator()</methodname> method,
  295. which accepts a boolean parameter, and <methodname>translatorIsDisabled()</methodname>
  296. to get the set value.
  297. </para>
  298. <programlisting language="php"><![CDATA[
  299. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  300. if (!$validator->isTranslatorDisabled()) {
  301. $validator->setDisableTranslator();
  302. }
  303. ]]></programlisting>
  304. <para>
  305. It is also possible to use a translator instead of setting own messages with
  306. <methodname>setMessage()</methodname>. But doing so, you should keep in mind, that the
  307. translator works also on messages you set your own.
  308. </para>
  309. </sect2>
  310. </sect1>