Zend_Form-QuickStart.xml 20 KB

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