Zend_Form-QuickStart.xml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13843 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.form.quickstart">
  5. <title>Zend_Form démarrage rapide</title>
  6. <para>Ce guide rapide couvre les bases de la création, de la validation, et du rendu des formulaires
  7. <classname>Zend_Form</classname>.</para>
  8. <sect2 id="zend.form.quickstart.create">
  9. <title>Créer un objet de formulaire</title>
  10. <para>Instanciez simplement un objet <classname>Zend_Form</classname> :</para>
  11. <programlisting role="php"><![CDATA[
  12. $form = new Zend_Form;
  13. ]]></programlisting>
  14. <para>Pour des usages avancés, vous voudriez probablement dériver <classname>Zend_Form</classname>, mais pour les
  15. formulaires simples, vous pouvez créez un formulaire depuis une instance de <classname>Zend_Form</classname>.</para>
  16. <para>Vous pouvez spécifier (c'est une bonne idée) l'action et la méthode d'envoi du formulaire grâce à
  17. <code>setAction()</code> et <code>setMethod()</code> :</para>
  18. <programlisting role="php"><![CDATA[
  19. $form->setAction('/resource/process')
  20. ->setMethod('post');
  21. ]]></programlisting>
  22. <para>Le code ci-dessus indique au formulaire d'être envoyé vers l'URL "/resource/process" avec la méthode HTTP
  23. POST. Ceci va impacter le rendu du formulaire (la balise <code>&lt;form&gt;</code>).</para>
  24. <para>Il est possible d'assigner les attributs HTML supplémentaires à la balise <code>&lt;form&gt;</code> via la
  25. méthode <code>setAttrib()</code> ou encore <code>setAttribs()</code>. Par exemple, indiquons un attribut "id" au
  26. formulaire :</para>
  27. <programlisting role="php"><![CDATA[
  28. $form->setAttrib('id', 'login');
  29. ]]></programlisting>
  30. </sect2>
  31. <sect2 id="zend.form.quickstart.elements">
  32. <title>Ajouter des éléments au formulaire</title>
  33. <para>Un formulaire ne sert à rien sans éléments. Le composant <classname>Zend_Form</classname> est fourni avec un
  34. ensemble d'éléments qui rendent du code XHTML via les aides de <classname>Zend_View</classname>. Voici ces aides :</para>
  35. <itemizedlist>
  36. <listitem>
  37. <para>button</para>
  38. </listitem>
  39. <listitem>
  40. <para>checkbox (ou plusieurs checkboxes avec multiCheckbox)</para>
  41. </listitem>
  42. <listitem>
  43. <para>hidden</para>
  44. </listitem>
  45. <listitem>
  46. <para>image</para>
  47. </listitem>
  48. <listitem>
  49. <para>password</para>
  50. </listitem>
  51. <listitem>
  52. <para>radio</para>
  53. </listitem>
  54. <listitem>
  55. <para>reset</para>
  56. </listitem>
  57. <listitem>
  58. <para>select (régulier ou à selection multiple)</para>
  59. </listitem>
  60. <listitem>
  61. <para>submit</para>
  62. </listitem>
  63. <listitem>
  64. <para>text</para>
  65. </listitem>
  66. <listitem>
  67. <para>textarea</para>
  68. </listitem>
  69. </itemizedlist>
  70. <para>Vous avez 2 manières de procéder pour ajouter les éléments au formulaire : instanciez vous même les objets
  71. des éléments, ou passer le type d'élément à <classname>Zend_Form</classname>, qui va alors créer le bon objet pour
  72. vous.</para>
  73. <para>Quelques exemples :</para>
  74. <programlisting role="php"><![CDATA[
  75. // Ajout d'un objet élément :
  76. $form->addElement(new Zend_Form_Element_Text('username'));
  77. // Passage d'un texte décrivant le futur objet élément, à Zend_Form :
  78. $form->addElement('text', 'username');
  79. ]]></programlisting>
  80. <para>Par défaut, ces éléments n'ont ni validateurs, ni filtres. Vous devrez donc ajoutez des validateurs et/ou
  81. des filtres, manuellement. Ceci est possible soit (a) avant de passer l'élément au formulaire, (b) via les
  82. options de configuration passés lors de la création de l'élément, ou (c) en récupérant l'objet déjà enregistré,
  83. depuis le formulaire, et en le configurant ensuite.</para>
  84. <para>Voyons comment passer un validateur à un élément dont nous créons l'objet. On peut passer soit l'objet
  85. <classname>Zend_Validate_*</classname>, soit une chaîne le décrivant :</para>
  86. <programlisting role="php"><![CDATA[
  87. $username = new Zend_Form_Element_Text('username');
  88. // Passage d'un objet Zend_Validate_*:
  89. $username->addValidator(new Zend_Validate_Alnum());
  90. // Passage du nom du validateur:
  91. $username->addValidator('alnum');
  92. ]]></programlisting>
  93. <para>En utilisant la technique de passage par le nom, vous pouvez ajouter un tableau d'options à passer au
  94. constructeur de l'objet validateur. Ceci se fait en troisième paramètre :</para>
  95. <programlisting role="php"><![CDATA[
  96. // Passage d'options au validateur
  97. $username->addValidator('regex', false, array('/^[a-z]/i'));
  98. ]]></programlisting>
  99. <para>(Le second paramètre permet d'indiquer au validateur s'il doit briser la chaîne de validation ou non. Par
  100. défaut, <code>false</code> : ce n'est donc pas le cas.)</para>
  101. <para>Vous pouvez avoir besoin de spécifier qu'un élément est requis. Ceci peut être fait en utilisant un
  102. accesseur ou en passant une option à la création de l'élément. Voici un exemple :</para>
  103. <programlisting role="php"><![CDATA[
  104. // Cet élément est requis:
  105. $username->setRequired(true);
  106. ]]></programlisting>
  107. <para>Lorsqu'un élément est requis, un validateur "NotEmpty" lui est ajouté, sur le dessus de sa pile de
  108. validateurs.</para>
  109. <para>La gestion des filtres est très semblable à celle des validateurs. Voyons comment ajouter un filtre qui
  110. retourne la donnée en minuscules :</para>
  111. <programlisting role="php"><![CDATA[
  112. $username->addFilter('StringtoLower');
  113. ]]></programlisting>
  114. <para>Finalement, la configuration complète de l'élément pourra ressembler à cela :</para>
  115. <programlisting role="php"><![CDATA[
  116. $username->addValidator('alnum')
  117. ->addValidator('regex', false, array('/^[a-z]/'))
  118. ->setRequired(true)
  119. ->addFilter('StringToLower');
  120. // ou, de manière plus compacte:
  121. $username->addValidators(array('alnum',
  122. array('regex', false, '/^[a-z]/i')
  123. ))
  124. ->setRequired(true)
  125. ->addFilters(array('StringToLower'));
  126. ]]></programlisting>
  127. <para>Aussi simple que cela puisse paraître, cela peut très vite devenir fastidieux de répéter ces opérations
  128. sur tous les éléments du formulaire. Reprenons le cas (b) d'au dessus : lorsque l'on crée un élément,
  129. <classname>Zend_Form::addElement()</classname> agit comme une fabrique et on peut lui passer des options de configuration.
  130. Par exemple, des validateurs ou des filtres. Essayons ceci :</para>
  131. <programlisting role="php"><![CDATA[
  132. $form->addElement('text', 'username', array(
  133. 'validators' => array(
  134. 'alnum',
  135. array('regex', false, '/^[a-z]/i')
  136. ),
  137. 'required' => true,
  138. 'filters' => array('StringToLower'),
  139. ));
  140. ]]></programlisting>
  141. <note>
  142. <para>Si vous vous apercevez que vous créez des éléments basés sur les mêmes options, étendre
  143. <classname>Zend_Form_Element</classname> peut devenir une bonne option. Votre nouvelle classe configurera directement
  144. vos objets.</para>
  145. </note>
  146. </sect2>
  147. <sect2 id="zend.form.quickstart.render">
  148. <title>Rendre (visuellement) un formulaire</title>
  149. <para>Rendre un formulaire est très simple. La plupart des éléments nécessitent les aides de vue
  150. <classname>Zend_View</classname> pour être rendus. Ils ont donc besoin d'un objet de vue. Pour rendre un formulaire,
  151. appelez sa méthode <code>render()</code> ou faites un <code>echo</code> devant l'objet.</para>
  152. <programlisting role="php"><![CDATA[
  153. // Appel explicite de render() :
  154. echo $form->render($view);
  155. // Supposant que setView() avec passage d'un objet Zend_View a été appelée avant :
  156. echo $form;
  157. ]]></programlisting>
  158. <para>Par défaut, <classname>Zend_Form</classname> et les <classname>Zend_Form_Element</classname> vont essayer de récupérer l'objet
  159. de vue depuis l'aide d'action <code>ViewRenderer</code>, ce qui signifie que vous n'aurez pas besoin de
  160. spécifier un objet de vue manuellement si vous utilisez le système MVC de Zend Framework. Pour rendre un
  161. formulaire dans une vue MVC, un simple <code>echo</code> suffit :</para>
  162. <programlisting role="php"><![CDATA[
  163. <?php echo $this->form ?>
  164. ]]></programlisting>
  165. <para>Techniquement, <classname>Zend_Form</classname> utilise des "décorateurs" pour effectuer le rendu visuel. Ces
  166. décorateurs peuvent remplacer le contenu, ou le placer avant ou après. Ils peuvent aussi introspecter l'élément
  167. qui leur est passé. Ainsi, vous pouvez chaîner plusieurs décorateurs pour utiliser des effets visuels. Par
  168. défaut, <classname>Zend_Form_Element</classname> combine quatre décorateurs pour s'afficher :</para>
  169. <programlisting role="php"><![CDATA[
  170. $element->addDecorators(array(
  171. 'ViewHelper',
  172. 'Errors',
  173. array('HtmlTag', array('tag' => 'dd')),
  174. array('Label', array('tag' => 'dt')),
  175. ));
  176. ]]></programlisting>
  177. <para>(Où &lt;HELPERNAME&gt; est le nom de l'aide de vue à utiliser, qui varie selon l'élément à rendre.)</para>
  178. <para>Les décorateurs par défaut (rappelés ci-dessus), produisent le rendu suivant :</para>
  179. <programlisting role="html"><![CDATA[
  180. <dt><label for="username" class="required">Username</dt>
  181. <dd>
  182. <input type="text" name="username" value="123-abc" />
  183. <ul class="errors">
  184. <li>'123-abc' has not only alphabetic and digit characters</li>
  185. <li>'123-abc' does not match against pattern '/^[a-z]/i'</li>
  186. </ul>
  187. </dd>
  188. ]]></programlisting>
  189. <para>(Le formatage peut un peu changer.)</para>
  190. <para>Vous pouvez changer les décorateurs utilisés par un élément si vous voulez avoir un visuel différent ;
  191. voyez la section sur les décorateurs pour plus d'informations.</para>
  192. <para>Le formulaire boucle sur ses éléments et entoure leur rendu d'une balise HTML <code>&lt;form&gt;</code>.
  193. Cette balise prend en compte la méthode, l'action, et les éventuels attributs passés via
  194. <code>setAttribs()</code>.</para>
  195. <para>Les éléments sont bouclés dans l'ordre dans lequel ils sont ajoutés, ou, si votre élément possède un
  196. attribut "order", celui-ci sera alors utilisé pour gérer sa place dans la pile des éléments :</para>
  197. <programlisting role="php"><![CDATA[
  198. $element->setOrder(10);
  199. ]]></programlisting>
  200. <para>Ou encore, à la création de l'élément via <code>addElement()</code> :</para>
  201. <programlisting role="php"><![CDATA[
  202. $form->addElement('text', 'username', array('order' => 10));
  203. ]]></programlisting>
  204. </sect2>
  205. <sect2 id="zend.form.quickstart.validate">
  206. <title>Vérifier qu'un formulaire est valide</title>
  207. <para>Après l'envoi du formulaire, il faut vérifier les valeurs que contiennent ses éléments. Tous les
  208. validateurs de chaque élément sont donc interrogés. Si l'élément était marqué comme requis et que l'élément ne
  209. reçoit aucune donnée, les validateurs suivants agiront sur une valeur <code>null</code>.</para>
  210. <para>D'où proviennent les données ? Vous pouvez utiliser <code>$_POST</code> ou <code>$_GET</code>, ou
  211. n'importe quelle source de données (service Web par exemple) :</para>
  212. <programlisting role="php"><![CDATA[
  213. if ($form->isValid($_POST)) {
  214. // succès!
  215. } else {
  216. // echec!
  217. }
  218. ]]></programlisting>
  219. <para>Avec des requêtes AJAX, il arrive que l'on ait besoin de ne valider qu'un élément, ou un groupe d'élément.
  220. <code>isValidPartial()</code> validera un formulaire partiel. Contrairement à <code>isValid()</code>, si une
  221. valeur est absente, les autres validateurs ne seront pas interrogés:</para>
  222. <programlisting role="php"><![CDATA[
  223. if ($form->isValidPartial($_POST)) {
  224. // Tous les éléments présents dans $_POST ont passé la validation
  225. } else {
  226. // un ou plusieurs éléments présent dans $_POST ont échoué
  227. }
  228. ]]></programlisting>
  229. <para>La méthode <code>processAjax()</code> peut aussi être utilisée pour valider partiellement un formulaire.
  230. Contrairement à <code>isValidPartial()</code>, cette méthode retournera les messages d'erreur de validation au
  231. format JSON.</para>
  232. <para>En supposant que les validateurs aient passé, vous pouvez dès lors récupérer les valeurs filtrées depuis
  233. les éléments :</para>
  234. <programlisting role="php"><![CDATA[
  235. $values = $form->getValues();
  236. ]]></programlisting>
  237. <para>Si vous désirez les valeurs non filtrées, utilisez :</para>
  238. <programlisting role="php"><![CDATA[
  239. $unfiltered = $form->getUnfilteredValues();
  240. ]]></programlisting>
  241. </sect2>
  242. <sect2 id="zend.form.quickstart.errorstatus">
  243. <title>Les statuts d'erreur</title>
  244. <para>Votre formulaire a échoué à l'envoi ? Dans la plupart des cas, vous voudrez rendre à nouveau le
  245. formulaire, mais avec les messages d'erreur affichés :</para>
  246. <programlisting role="php"><![CDATA[
  247. if (!$form->isValid($_POST)) {
  248. echo $form;
  249. // ou en assignant un objet de vue (cas non-MVC typiquement)
  250. $this->view->form = $form;
  251. return $this->render('form');
  252. }
  253. ]]></programlisting>
  254. <para>Si vous voulez inspecter les erreurs, 2 méthodes s'offrent à vous. <code>getErrors()</code> retourne un
  255. tableau associatif avec en clé le nom de l'élément et en valeur un tableau de codes d'erreurs.
  256. <code>getMessages()</code> retourne un tableau associatif avec en clé le nom de l'élément, et en valeur un
  257. tableau de messages d'erreurs (code=&gt;message). Tout élément ne comportant pas d'erreur ne sera pas inclus
  258. dans le tableau.</para>
  259. </sect2>
  260. <sect2 id="zend.form.quickstart.puttingtogether">
  261. <title>Assembler le tout ensemble</title>
  262. <para>Créons un formulaire de d'authentification. Il aura besoin d'élément représentant :</para>
  263. <itemizedlist>
  264. <listitem>
  265. <para>un nom</para>
  266. </listitem>
  267. <listitem>
  268. <para>un mot de passe</para>
  269. </listitem>
  270. <listitem>
  271. <para>un bouton d'envoi</para>
  272. </listitem>
  273. </itemizedlist>
  274. <para>Pour notre exemple, imaginons un nom composé de caractères alphanumériques uniquement. Le nom commencera
  275. par une lettre, et devra faire entre 6 et 20 caractères de long, qui seront normalisés en lettres minuscules.
  276. Les mots de passe feront 6 caractères minimum.</para>
  277. <para>Nous allons utiliser la puissance de <classname>Zend_Form</classname> pour configurer le formulaire et effectuer le
  278. rendu :</para>
  279. <programlisting role="php"><![CDATA[
  280. $form = new Zend_Form();
  281. $form->setAction('/user/login')
  282. ->setMethod('post');
  283. // élément nom :
  284. $username = $form->createElement('text', 'username');
  285. $username->addValidator('alnum')
  286. ->addValidator('regex', false, array('/^[a-z]+/'))
  287. ->addValidator('stringLength', false, array(6, 20))
  288. ->setRequired(true)
  289. ->addFilter('StringToLower');
  290. // élément mot de passe :
  291. $password = $form->createElement('password', 'password');
  292. $password->addValidator('StringLength', false, array(6))
  293. ->setRequired(true);
  294. // Ajout des éléments au formulaire
  295. $form->addElement($username)
  296. ->addElement($password)
  297. // addElement() agit comme une fabrique qui crée un bouton 'Login'
  298. ->addElement('submit', 'login', array('label' => 'Login'));
  299. ]]></programlisting>
  300. <para>Il nous faut à présent un contrôleur pour gérer tout cela:</para>
  301. <programlisting role="php"><![CDATA[
  302. class UserController extends Zend_Controller_Action
  303. {
  304. public function getForm()
  305. {
  306. // Créer le formulaire comme décrit ci-dessus
  307. return $form;
  308. }
  309. public function indexAction()
  310. {
  311. // rend user/form.phtml
  312. $this->view->form = $this->getForm();
  313. $this->render('form');
  314. }
  315. public function loginAction()
  316. {
  317. if (!$this->getRequest()->isPost()) {
  318. return $this->_forward('index');
  319. }
  320. $form = $this->getForm();
  321. if (!$form->isValid($_POST)) {
  322. // Validation en echec
  323. $this->view->form = $form;
  324. return $this->render('form');
  325. }
  326. $values = $form->getValues();
  327. // les valeurs sont récupérées
  328. }
  329. }
  330. ]]></programlisting>
  331. <para>Le script de vue pour afficher le formulaire :</para>
  332. <programlisting role="php"><![CDATA[
  333. <h2>Identifiez vous:</h2>
  334. <?= $this->form ?>
  335. ]]></programlisting>
  336. <para>Comme vous le voyez sur le code du contrôleur, il reste du travail à faire une fois le formulaire validé.
  337. Par exemple, utiliser <classname>Zend_Auth</classname> pour déclencher un processus d'identification.</para>
  338. </sect2>
  339. <sect2 id="zend.form.quickstart.config">
  340. <title>Utiliser un objet <classname>Zend_Config</classname></title>
  341. <para>Toutes les classes du composant <classname>Zend_Form</classname> sont configurables au moyen d'un objet
  342. <classname>Zend_Config</classname> ; vous pouvez passer un objet <classname>Zend_Config</classname> au constructeur ou via la
  343. méthode <code>setConfig()</code>. Voyons comment créer le formulaire ci-dessus, au moyen d'un fichier INI. Tout
  344. d'abord, nous nous baserons sur une section "developement", et nos instructions devront être imbriquées afin de
  345. refléter la configuration. Ensuite nous utiliserons un espace de nom "user" correspondant au contrôleur, puis un
  346. "login" concernant le formulaire (ceci permet de ranger les données correctement dans le fichier INI) :</para>
  347. <programlisting role="ini"><![CDATA[
  348. [development]
  349. ; informations générales du formulaire
  350. user.login.action = "/user/login"
  351. user.login.method = "post"
  352. ; element username
  353. user.login.elements.username.type = "text"
  354. user.login.elements.username.options.validators.alnum.validator = "alnum"
  355. user.login.elements.username.options.validators.regex.validator = "regex"
  356. user.login.elements.username.options.validators.regex.options.pattern = "/^[a-z]/i"
  357. user.login.elements.username.options.validators.strlen.validator = "StringLength"
  358. user.login.elements.username.options.validators.strlen.options.min = "6"
  359. user.login.elements.username.options.validators.strlen.options.max = "20"
  360. user.login.elements.username.options.required = true
  361. user.login.elements.username.options.filters.lower.filter = "StringToLower"
  362. ; element password
  363. user.login.elements.password.type = "password"
  364. user.login.elements.password.options.validators.strlen.validator = "StringLength"
  365. user.login.elements.password.options.validators.strlen.options.min = "6"
  366. user.login.elements.password.options.required = true
  367. ; element submit
  368. user.login.elements.submit.type = "submit"
  369. ]]></programlisting>
  370. <para>Le constructeur du formulaire ressemblera alors à ceci :</para>
  371. <programlisting role="php"><![CDATA[
  372. $config = new Zend_Config_Ini($configFile, 'development');
  373. $form = new Zend_Form($config->user->login);
  374. ]]></programlisting>
  375. <para>et tout le formulaire sera défini.</para>
  376. </sect2>
  377. <sect2 id="zend.form.quickstart.conclusion">
  378. <title>Conclusion</title>
  379. <para>Vous êtes maintenant capable de libérer la puissance de <classname>Zend_Form</classname>. Continuez de lire les
  380. chapitres suivants pour utiliser ce composant en profondeur !</para>
  381. </sect2>
  382. </sect1>
  383. <!--
  384. vim:se ts=4 sw=4 et:
  385. -->