Zend_Controller-ActionHelpers-ViewRenderer.xml 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.viewrenderer">
  5. <title>ViewRenderer</title>
  6. <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
  7. <title>Introduction</title>
  8. <para>
  9. L'aide <emphasis>ViewRenderer</emphasis> apporte les comportements suivants&#160;:
  10. </para>
  11. <itemizedlist>
  12. <listitem>
  13. <para>
  14. Élimine le besoin d'instancier un objet de vue dans ses contrôleurs. Ceci
  15. devient automatique.
  16. </para>
  17. </listitem>
  18. <listitem>
  19. <para>
  20. Configure automatiquement les chemins vers les scripts de vue, les aides,
  21. et les filtres, en se basant sur le module actuel et associe le nom du module
  22. comme préfixe de classe pour les aides et les filtres.
  23. </para>
  24. </listitem>
  25. <listitem>
  26. <para>
  27. Créer un objet de vue général accessible pour tous les contrôleurs et
  28. donc pour toutes les actions disptachées.
  29. </para>
  30. </listitem>
  31. <listitem>
  32. <para>
  33. Autorise le développeur à personnaliser les options de rendu de la vue.
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>Donne la possibilité de rendre automatiquement un script de vue.</para>
  38. </listitem>
  39. <listitem>
  40. <para>
  41. Donne accès aux paramètres configurant le chemin de base (base path) et
  42. le chemin des scripts (script path), de la vue.
  43. </para>
  44. </listitem>
  45. </itemizedlist>
  46. <note>
  47. <para>
  48. Su vous utilisez <methodname>_forward()</methodname>,
  49. <methodname>redirect()</methodname>, ou <methodname>render()</methodname>
  50. manuellement, le rendu automatique sera annulé car
  51. <emphasis>ViewRenderer</emphasis> saura que vous prenez la main.
  52. </para>
  53. </note>
  54. <note>
  55. <para>
  56. Le <emphasis>ViewRenderer</emphasis> est activé par défaut dans le contrôleur
  57. frontal. Pour le désactiver, utilisez le paramètre
  58. <emphasis>noViewRenderer</emphasis>
  59. (<command>$front-&gt;setParam('noViewRenderer', true);</command>) ou retirez
  60. l'objet du gestionnaire d'aides
  61. (<methodname>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</methodname>).
  62. </para>
  63. <para>
  64. Si vous voulez modifier un paramètre du <emphasis>ViewRenderer</emphasis> avant la
  65. distribution du contrôleur frontal, il existe deux moyens&#160;:
  66. </para>
  67. <itemizedlist>
  68. <listitem>
  69. <para>
  70. Instanciez et enregistrez votre propre objet
  71. <emphasis>ViewRenderer</emphasis> et passez le au gestionnaire
  72. d'aides&#160;:
  73. </para>
  74. <programlisting language="php"><![CDATA[
  75. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
  76. $viewRenderer->setView($view)
  77. ->setViewSuffix('php');
  78. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  79. ]]></programlisting>
  80. </listitem>
  81. <listitem>
  82. <para>
  83. Initialisez et/ou récupérez l'objet
  84. <emphasis>ViewRenderer</emphasis> via le gestionnaire d'aides&#160;:
  85. </para>
  86. <programlisting language="php"><![CDATA[
  87. $viewRenderer =
  88. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  89. $viewRenderer->setView($view)
  90. ->setViewSuffix('php');
  91. ]]></programlisting>
  92. </listitem>
  93. </itemizedlist>
  94. </note>
  95. </sect4>
  96. <sect4 id="zend.controller.actionhelper.viewrenderer.api">
  97. <title>API</title>
  98. <para>
  99. L'usage le plus banal consiste à instancier et passer l'objet
  100. <emphasis>ViewRenderer</emphasis> au gestionnaire d'aides. La manière la plus simple
  101. est d'utiliser la méthode statique <methodname>getStaticHelper()</methodname>
  102. du gestionnaire, qui s'occupe de tout ceci en une passe&#160;:
  103. </para>
  104. <programlisting language="php"><![CDATA[
  105. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  106. ]]></programlisting>
  107. <para>
  108. La première action demandée déclenche l'instanciation de l'objet de vue par le
  109. <emphasis>ViewRenderer</emphasis>. A chaque instanciation de contrôleur, la
  110. méthode <methodname>init()</methodname> de l'objet
  111. <emphasis>ViewRenderer</emphasis> est appelée. Elle va configurer la vue et appeler
  112. <methodname>addScriptPath()</methodname> avec un chemin relatif au dossier courant.
  113. Ceci a pour effet de "namespacer" toutes les aides et les filtres de vue pour le
  114. module en cours.
  115. </para>
  116. <para>
  117. A chaque <methodname>postDispatch()</methodname> d'action,
  118. <methodname>render()</methodname> est appelée.
  119. </para>
  120. <para>Voici un exemple&#160;:</para>
  121. <programlisting language="php"><![CDATA[
  122. // Bar controller , module foo :
  123. class Foo_BarController extends Zend_Controller_Action
  124. {
  125. // Rend bar/index.phtml par défaut; rien à faire c'est automatique
  126. public function indexAction()
  127. {
  128. }
  129. // Rend bar/populate.phtml avec une variable 'foo' à la valeur 'bar'.
  130. // l'objet de vue est défini dans le preDispatch(), il est donc
  131. // accessible.
  132. public function populateAction()
  133. {
  134. $this->view->foo = 'bar';
  135. }
  136. }
  137. ...
  138. // Dans un des scripts de vue :
  139. $this->foo(); // appelle Foo_View_Helper_Foo::foo()
  140. ]]></programlisting>
  141. <para>
  142. Le <emphasis>ViewRenderer</emphasis> définit de même des accesseurs pour configurer la
  143. vue qu'il encapsule&#160;:
  144. </para>
  145. <itemizedlist>
  146. <listitem>
  147. <para>
  148. <methodname>setView($view)</methodname> Passage de l'objet de vue au
  149. <emphasis>ViewRenderer</emphasis>. Il devient accessible comme une propriété
  150. publique de l'objet&#160;: <varname>$view</varname>.
  151. </para>
  152. </listitem>
  153. <listitem>
  154. <para>
  155. <methodname>setNeverRender($flag = true)</methodname> peut être utilisée pour
  156. désactiver le rendu automatique de la vue dans tous les contrôleurs.
  157. Si réglé à <constant>TRUE</constant>
  158. <methodname>postDispatch()</methodname> ne va pa automatiquement appeler
  159. <methodname>render()</methodname> dans le contrôleur courant.
  160. <methodname>getNeverRender()</methodname> retourne ce paramètre.
  161. </para>
  162. </listitem>
  163. <listitem>
  164. <para>
  165. <methodname>setNoRender($flag = true)</methodname> peut être utilisée pour
  166. désactiver le rendu automatique de la vue dans le contrôleur actuel.
  167. Si réglé à <constant>TRUE</constant>
  168. <methodname>postDispatch()</methodname> ne va pa automatiquement appeler
  169. <methodname>render()</methodname> dans le contrôleur courant, mais
  170. <methodname>preDispatch()</methodname> réactive le paramètre pour l'action
  171. suivante. <methodname>getNoRender()</methodname> retourne cette option.
  172. </para>
  173. </listitem>
  174. <listitem>
  175. <para>
  176. <methodname>setNoController($flag = true)</methodname> est utilisée pour
  177. spécifier à <methodname>render()</methodname> de ne pas chercher le script
  178. de vue dans le sous répertoire après le contrôleur (correspondant à l'action).
  179. Par défaut, cette recherche est effectuée.
  180. <methodname>getNoController()</methodname> retourne ce paramètre.
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <methodname>setNeverController($flag = true)</methodname> fonctionne de manière
  186. similaire à <methodname>setNoController()</methodname>, mais pour tous les
  187. contrôleurs.<methodname>getNeverController()</methodname> est l'autre
  188. accesseur.
  189. </para>
  190. </listitem>
  191. <listitem>
  192. <para>
  193. <methodname>setScriptAction($name)</methodname> peut être utilisée pour
  194. spécifier le script de vue d'une action à rendre. <varname>$name</varname>
  195. doit être le nom de l'action sans le suffixe (et sans le nom du contrôleur
  196. sauf si <emphasis>noController</emphasis> a été activé). Si vous n'utilisez
  197. pas cette méthode elle cherchera le script de vue correspondant au nom de
  198. l'action en cours (issue de l'objet de requête).
  199. <methodname>getScriptAction()</methodname> retourne la valeur actuelle de ce
  200. paramètre.
  201. </para>
  202. </listitem>
  203. <listitem>
  204. <para>
  205. <methodname>setResponseSegment($name)</methodname> dit dans quel segment de la
  206. réponse rendre le script. Par défaut, la vue est rendue dans le segment par
  207. défaut. <methodname>getResponseSegment()</methodname> retourne cette valeur.
  208. </para>
  209. </listitem>
  210. <listitem>
  211. <para>
  212. <methodname>initView($path, $prefix, $options)</methodname> doit être appelée
  213. pour configurer la vue : son "base path", le préfixe de classe pour les filtres
  214. et aides, et des options du <emphasis>ViewRenderer</emphasis> matérialisées
  215. par&#160;: <emphasis>neverRender</emphasis>, <emphasis>noRender</emphasis>,
  216. <emphasis>noController</emphasis>, <emphasis>scriptAction</emphasis>, et
  217. <emphasis>responseSegment</emphasis>.
  218. </para>
  219. </listitem>
  220. <listitem>
  221. <para>
  222. <methodname>setRender($action = null, $name = null, $noController =
  223. false)</methodname> vous permet de spécifier les paramètres
  224. <emphasis>scriptAction</emphasis>, <emphasis>responseSegment</emphasis>, et
  225. <emphasis>noController</emphasis> en une fois.
  226. <methodname>direct()</methodname> est un alias qui permet un appel rapide
  227. depuis le contrôleur&#160;:
  228. </para>
  229. <programlisting language="php"><![CDATA[
  230. // Rend 'foo' au lieu du script correspondant à l'action courante
  231. $this->_helper->viewRenderer('foo');
  232. // rend form.phtml dans le segment 'html' de la réponse sans utiliser le
  233. // sous repertoire contrôleur pour chercher le script de vue :
  234. $this->_helper->viewRenderer('form', 'html', true);
  235. ]]></programlisting>
  236. <note>
  237. <para>
  238. <methodname>setRender()</methodname> et <methodname>direct()</methodname>
  239. ne rendent pas un script de vue à proprement parler, mais elles notifient
  240. au <methodname>postDispatch()</methodname> et
  241. <methodname>render()</methodname> sera utilisée pour le faire.
  242. </para>
  243. </note>
  244. </listitem>
  245. </itemizedlist>
  246. <para>
  247. Le constructeur de <emphasis>ViewRenderer</emphasis> accepte aussi un objet de vue et
  248. un tableau d'options, de la même manière que <methodname>initView()</methodname>&#160;:
  249. </para>
  250. <programlisting language="php"><![CDATA[
  251. $view = new Zend_View(array('encoding' => 'UTF-8'));
  252. $options = array('noController' => true, 'neverRender' => true);
  253. $viewRenderer =
  254. new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
  255. ]]></programlisting>
  256. <para>
  257. Il est aussi possible de personnaliser les chemins utilisés pour déterminer le
  258. base path (chemin de base) de la vue ainsi que le script path (chemin vers les scripts
  259. de vue). Des méthodes le permettent, utilisez les options suivantes avec&#160;:
  260. </para>
  261. <itemizedlist>
  262. <listitem>
  263. <para>
  264. <emphasis>:moduleDir</emphasis> représente le module courant (par convention le
  265. dossier parent au dossier contrôleur).
  266. </para>
  267. </listitem>
  268. <listitem>
  269. <para><emphasis>:module</emphasis> pointe vers le module actuel.</para>
  270. </listitem>
  271. <listitem>
  272. <para><emphasis>:controller</emphasis> pointe vers le contrôleur actuel.</para>
  273. </listitem>
  274. <listitem>
  275. <para><emphasis>:action</emphasis> représente l'action actuellement traitée.</para>
  276. </listitem>
  277. <listitem>
  278. <para>
  279. <emphasis>:suffix</emphasis> est utilisée pour le suffixe du script de vue.
  280. <methodname>setViewSuffix()</methodname> permet aussi de le modifier.
  281. </para>
  282. </listitem>
  283. </itemizedlist>
  284. <para>Toutes ces options s'utilisent avec les méthodes ci-après&#160;:</para>
  285. <itemizedlist>
  286. <listitem>
  287. <para>
  288. <methodname>setViewBasePathSpec($spec)</methodname> vous permet de changer le
  289. dossier donnant accès aux dossiers de la vue&#160;: le base path. Par défaut
  290. il s'agit de <filename>:moduleDir/views</filename>. L'accesseur de récupération
  291. est <methodname>getViewBasePathSpec()</methodname>.
  292. </para>
  293. </listitem>
  294. <listitem>
  295. <para>
  296. <methodname>setViewScriptPathSpec($spec)</methodname> : une fois dans le base
  297. path, le rendu cherche le script de vue dans le script path, que cette méthode
  298. permet de définir. La valeur par défaut est
  299. <filename>:controller/:action.:suffix</filename> et
  300. l'autre accesseur est <methodname>getViewScriptPathSpec()</methodname>.
  301. </para>
  302. </listitem>
  303. <listitem>
  304. <para>
  305. <methodname>setViewScriptPathNoControllerSpec($spec)</methodname> Une fois
  306. dans le base path, si <emphasis>noController</emphasis> est activé, le rendu
  307. cherche le script de vue dans le chemin que cette méthode permet de définir.
  308. La valeur par défaut est <filename>:action.:suffix</filename> et l'autre
  309. accesseur est <methodname>getViewScriptPathNoControllerSpec()</methodname>.
  310. </para>
  311. </listitem>
  312. </itemizedlist>
  313. <para>
  314. <emphasis>ViewRenderer</emphasis> utilise un inflecteur&#160;:
  315. <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link>, pour résoudre les
  316. options de chemin, en chemins réels. Pour une personnalisation maximale, vous pouvez
  317. interagir avec cet inflecteur à l'aide des méthodes suivantes&#160;:
  318. </para>
  319. <itemizedlist>
  320. <listitem>
  321. <para>
  322. <methodname>getInflector()</methodname> retourne l'inflecteur. Si aucun
  323. n'existe, <emphasis>ViewRenderer</emphasis> en crée un avec des options par
  324. défaut.
  325. </para>
  326. <para>
  327. Par défaut, les règles de l'inflecteur sont statiques autant pour le
  328. suffixe et le répertoire module, que pour la cible. Ceci permet au
  329. <emphasis>ViewRenderer</emphasis> de modifier ces valeurs dynamiquement.
  330. </para>
  331. </listitem>
  332. <listitem>
  333. <para>
  334. <methodname>setInflector($inflector, $reference)</methodname> peut être
  335. utilisée pour passer son propre inflecteur à
  336. <emphasis>ViewRenderer</emphasis>. Si <varname>$reference</varname> est à
  337. <constant>TRUE</constant>, alors le suffixe, le répertoire du module et
  338. la cible seront affectés en fonction des propriétés de
  339. <emphasis>ViewRenderer</emphasis>.
  340. </para>
  341. </listitem>
  342. </itemizedlist>
  343. <note>
  344. <title>Règles de résolution par défaut</title>
  345. <para>
  346. Le <emphasis>ViewRenderer</emphasis> utilise certaines règles par défaut pour
  347. chercher ses scripts de vue, voyez plutôt&#160;:
  348. </para>
  349. <itemizedlist>
  350. <listitem>
  351. <para>
  352. <emphasis>:module</emphasis>&#160;: casseMélangée et motsEnNotationCamel
  353. qui deviennent des mots séparés par des tirets, et en minuscules.
  354. "FooBarBaz" devient "foo-bar-baz".
  355. </para>
  356. <para>
  357. En interne, l'inflecteur utilise les filtres
  358. <classname>Zend_Filter_Word_CamelCaseToDash</classname> et
  359. <classname>Zend_Filter_StringToLower</classname>.
  360. </para>
  361. </listitem>
  362. <listitem>
  363. <para>
  364. <emphasis>:controller</emphasis>&#160;: casseMélangée et
  365. motsEnNotationCamel qui deviennent des mots séparés par des tirets&#160;;
  366. les tirets bas eux, se transforment en séparateur de dossier et tout est
  367. passé en minuscules. "<classname>FooBar</classname>" devient
  368. "foo-bar"&#160;; "<classname>FooBar_Admin</classname>"
  369. devient "<filename>foo-bar/admin</filename>".
  370. </para>
  371. <para>
  372. En interne, l'inflecteur utilise les filtres
  373. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  374. <classname>Zend_Filter_Word_UnderscoreToSeparator</classname>, et
  375. <classname>Zend_Filter_StringToLower</classname>.
  376. </para>
  377. </listitem>
  378. <listitem>
  379. <para>
  380. <emphasis>:action</emphasis>&#160;: casseMélangée et motsEnNotationCamel
  381. qui se transforment en mots séparés par des tirets, minuscules. Les
  382. caractères non alphanumériques deviennent des tirets. "fooBar" devient
  383. "foo-bar"&#160;; "foo-barBaz" devient "foo-bar-baz".
  384. </para>
  385. <para>
  386. Pour ceci, l'inflecteur interne utilise les filtres
  387. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  388. <classname>Zend_Filter_PregReplace</classname>, et
  389. <classname>Zend_Filter_StringToLower</classname>.
  390. </para>
  391. </listitem>
  392. </itemizedlist>
  393. </note>
  394. <para>
  395. Enfin, l'<acronym>API</acronym> de <emphasis>ViewRenderer</emphasis> vous propose
  396. aussi des méthodes pour déterminer les scripts de vue, et rendre la vue. Celles-ci
  397. se décomposent en :
  398. </para>
  399. <itemizedlist>
  400. <listitem>
  401. <para>
  402. <methodname>renderScript($script, $name)</methodname> va vous permettre de
  403. spécifier pleinement le script de vue à rendre, et éventuellement un nom de
  404. segment de réponse dans lequel rendre. <emphasis>ViewRenderer</emphasis>
  405. s'attend à un paramètre <varname>$script</varname> représentant un chemin
  406. complet vers un script de vue, telle que la méthode de la vue
  407. <methodname>render()</methodname> l'attend.
  408. </para>
  409. <note>
  410. <para>
  411. Une fois rendue, la vue utilise <emphasis>noRender</emphasis> pour éviter
  412. un double rendu automatisé.
  413. </para>
  414. </note>
  415. <note>
  416. <para>
  417. Par défaut, <methodname>Zend_Controller_Action::renderScript()</methodname>
  418. est un proxy vers la méthode <methodname>renderScript()</methodname> de
  419. <emphasis>ViewRenderer</emphasis>.
  420. </para>
  421. </note>
  422. </listitem>
  423. <listitem>
  424. <para>
  425. <methodname>getViewScript($action, $vars)</methodname> récupère le chemin du
  426. script de vue en se basant sur les paramètres $action et $vars.
  427. <varname>$vars</varname> peut contenir "moduleDir", "module", "controller",
  428. "action", et "suffix"), sinon les valeurs de la requête actuelle seront
  429. utilisées.
  430. </para>
  431. <para>
  432. <methodname>getViewScript()</methodname> utilisera
  433. <emphasis>viewScriptPathSpec</emphasis> ou
  434. <emphasis>viewScriptPathNoControllerSpec</emphasis> selon le paramètre
  435. <emphasis>noController</emphasis>.
  436. </para>
  437. <para>
  438. Les délimiteurs apparaissant dans les modules, contrôleurs ou actions seront
  439. remplacés par des tirets ("-"). Ainsi pour un contrôleur
  440. "<command>foo.bar</command>" et une action "<command>baz:bat</command>", il
  441. résultera un chemin de vue "<filename>foo-bar/baz-bat.phtml</filename>".
  442. </para>
  443. <note>
  444. <para>
  445. Par défaut <methodname>Zend_Controller_Action::getViewScript()</methodname>
  446. est un proxy vers la méthode <methodname>getViewScript()</methodname> de
  447. <emphasis>ViewRenderer</emphasis>.
  448. </para>
  449. </note>
  450. </listitem>
  451. <listitem>
  452. <para>
  453. <methodname>render($action, $name, $noController)</methodname> a beaucoup de
  454. responsabilités&#160;: d'abord, elle vérifie si <varname>$name</varname> ou
  455. <varname>$noController</varname> lui ont été passés, si c'est le cas, elle
  456. configure correctement les paramètres <code>responseSegment</code> et
  457. <code>noController</code> dans le ViewRenderer. Elle passe ensuite
  458. <varname>$action</varname>, si spécifié, à
  459. <methodname>getViewScript()</methodname>. Enfin, elle
  460. passe le script de vue calculé à <methodname>renderScript()</methodname>.
  461. </para>
  462. <note>
  463. <para>
  464. Attention aux effets secondaires avec
  465. <methodname>render()</methodname>&#160;: les valeurs segment de réponse,
  466. et <code>noController</code> vont persister dans l'objet ViewRenderer.
  467. De plus, <methodname>noRender()</methodname> va être appelée.
  468. </para>
  469. </note>
  470. <note>
  471. <para>
  472. Par défaut, <methodname>Zend_Controller_Action::render()</methodname>
  473. est un proxy vers <methodname>render()</methodname> de
  474. <emphasis>ViewRenderer</emphasis>.
  475. </para>
  476. </note>
  477. </listitem>
  478. <listitem>
  479. <para>
  480. <methodname>renderBySpec($action, $vars, $name)</methodname> vous fournit le
  481. moyen de passer des paramètres de spécification pour le dossier de script de
  482. vue. Cette méthode passe <varname>$action</varname> et <varname>$vars</varname>
  483. à <methodname>getScriptPath()</methodname>, pour en déduire un chemin qu'elle
  484. envoie alors avec <varname>$name</varname> à
  485. <methodname>renderScript()</methodname>.
  486. </para>
  487. </listitem>
  488. </itemizedlist>
  489. </sect4>
  490. <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
  491. <title>Exemples</title>
  492. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
  493. <title>Usage de base</title>
  494. <para>
  495. L'utilisation la plus basique consiste à initialiser ou et enregistrer un
  496. objet <emphasis>ViewRenderer</emphasis> dans le gestionnaire d'aides (helper
  497. broker), et ensuite lui passer des variables dans vos contrôleurs.
  498. </para>
  499. <programlisting language="php"><![CDATA[
  500. // Dans le fichier de démarrage :
  501. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  502. ...
  503. // 'foo' module, contrôleur 'bar' :
  504. class Foo_BarController extends Zend_Controller_Action
  505. {
  506. // Rend bar/index.phtml par défaut, rien à faire
  507. public function indexAction()
  508. {
  509. }
  510. // Rend bar/populate.phtml avec la variable 'foo' à la valeur 'bar'.
  511. // L'objet de vue est rendu disponible en preDispatch().
  512. public function populateAction()
  513. {
  514. $this->view->foo = 'bar';
  515. }
  516. // Ne rend rien, car on demande un nouveau jeton de distribution
  517. public function bazAction()
  518. {
  519. $this->_forward('index');
  520. }
  521. // Ne rend rien, une redirection est demandée
  522. public function batAction()
  523. {
  524. $this->_redirect('/index');
  525. }
  526. }
  527. ]]></programlisting>
  528. </example>
  529. <note>
  530. <title>
  531. Conventions de noms&#160;: délimiteurs de mots dans les noms de contrôleur et
  532. d'action
  533. </title>
  534. <para>
  535. Si les noms de votre contrôleur ou de votre action sont composés de plusieurs
  536. mots, le distributeur s'attend à ce qu'ils soient séparés par des caractères bien
  537. définis, dans l'<acronym>URL</acronym>. Le <emphasis>ViewRenderer</emphasis> les
  538. transforme alors en '/' pour les chemins, ou tirets '-' pour les mots. Ainsi, un
  539. appel à <filename>/foo.bar/baz.bat</filename> distribuera
  540. <methodname>FooBarController::bazBatAction()</methodname> dans
  541. <filename>FooBarController.php</filename>, et ceci rendra
  542. <filename>foo-bar/baz-bat.phtml</filename>. Un appel à
  543. <filename>/bar_baz/baz-bat</filename> distribuera vers
  544. <methodname>Bar_BazController::bazBatAction()</methodname> dans
  545. <filename>Bar/BazController.php</filename> (notez la séparation du chemin),
  546. et rend <filename>bar/baz/baz-bat.phtml</filename>.
  547. </para>
  548. <para>
  549. Notez dans le second exemple, le module est celui par défaut, mais comme un
  550. séparateur de chemin (tiret bas ou "_") est donné, alors le contrôleur distribué
  551. devient <classname>Bar_BazController</classname>, dans
  552. <filename>Bar/BazController.php</filename>.
  553. </para>
  554. </note>
  555. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
  556. <title>Désactivation du rendu automatique</title>
  557. <para>
  558. Il peut être nécessaire dans certains cas de désactiver manuellement le rendu
  559. automatique de vue effectué par ViewRenderer. Par exemple, si le contrôleur doit
  560. retourner une sortie spéciale, comme <acronym>XML</acronym> ou
  561. <acronym>JSON</acronym>. Deux options s'offrent à vous :
  562. <methodname>setNeverRender()</methodname>) et
  563. <methodname>setNoRender()</methodname>.
  564. </para>
  565. <programlisting language="php"><![CDATA[
  566. // Baz controller class, bar module :
  567. class Bar_BazController extends Zend_Controller_Action
  568. {
  569. public function fooAction()
  570. {
  571. // Ne rend pas automatiquement cette action
  572. $this->_helper->viewRenderer->setNoRender();
  573. }
  574. }
  575. // Bat controller class, bar module :
  576. class Bar_BatController extends Zend_Controller_Action
  577. {
  578. public function preDispatch()
  579. {
  580. // Ne rend plus aucune action de ce contrôleur
  581. $this->_helper->viewRenderer->setNoRender();
  582. }
  583. }
  584. ]]></programlisting>
  585. </example>
  586. <note>
  587. <para>
  588. Utiliser <methodname>setNeverRender()</methodname>), pour désactiver totalement
  589. le rendu automatique de vue vous fera perdre un des avantages majeur de
  590. <emphasis>ViewRenderer</emphasis>.
  591. </para>
  592. </note>
  593. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
  594. <title>Choix d'un script de vue différent</title>
  595. <para>
  596. Il peut arriver que vous éprouviez le besoin de rendre un script de vue
  597. différent de celui correspondant à l'action en cours de distribution. Par exemple,
  598. un contrôleur qui possède deux actions ajout et édition, qui sont susceptibles
  599. toutes les deux de rendre le même script de vue. Utilisez alors
  600. <methodname>setScriptAction()</methodname>, <methodname>setRender()</methodname>,
  601. ou appelez directement l'aide ViewRenderer qui invoquera
  602. <methodname>setRender()</methodname>&#160;:
  603. </para>
  604. <programlisting language="php"><![CDATA[
  605. // Bar controller class, foo module :
  606. class Foo_BarController extends Zend_Controller_Action
  607. {
  608. public function addAction()
  609. {
  610. // Rend 'bar/form.phtml' plutôt que 'bar/add.phtml'
  611. $this->_helper->viewRenderer('form');
  612. }
  613. public function editAction()
  614. {
  615. // Rend 'bar/form.phtml' au lieu de 'bar/edit.phtml'
  616. $this->_helper->viewRenderer->setScriptAction('form');
  617. }
  618. public function processAction()
  619. {
  620. // un peu de validation...
  621. if (!$valid) {
  622. // Rend 'bar/form.phtml' à la place de 'bar/process.phtml'
  623. $this->_helper->viewRenderer->setRender('form');
  624. return;
  625. }
  626. // continue le processus...
  627. }
  628. }
  629. ]]></programlisting>
  630. </example>
  631. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
  632. <title>Modification de l'objet de vue</title>
  633. <para>
  634. Si vous désirez modifier l'objet de vue absorbé par
  635. <code>ViewRenderer</code>, pour par exemple ajouter un chemin vers des aides
  636. spécifique, ou spécifier l'encodage, vous pourriez par exemple récupérer l'objet de
  637. vue depuis le <emphasis>ViewRenderer</emphasis>, ou dans un contrôleur.
  638. </para>
  639. <programlisting language="php"><![CDATA[
  640. // Bar controller class, foo module :
  641. class Foo_BarController extends Zend_Controller_Action
  642. {
  643. public function preDispatch()
  644. {
  645. // change l'encodage de la vue
  646. $this->view->setEncoding('UTF-8');
  647. }
  648. public function bazAction()
  649. {
  650. // Récupère l'objet de vue, et lui passe la fonction
  651. // d'2chappement 'htmlspecialchars'
  652. $view = $this->_helper->viewRenderer->view;
  653. $view->setEscape('htmlspecialchars');
  654. }
  655. }
  656. ]]></programlisting>
  657. </example>
  658. </sect4>
  659. <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
  660. <title>Utilisation avancée</title>
  661. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
  662. <title>Changement des spécifications de dossier</title>
  663. <para>
  664. Dans certains cas, il peut être nécessaire d'utiliser un chemin absolu, fixe.
  665. Par exemple si vous ne donnez accès à vos graphistes qu'à un seul dossier, en
  666. utilisant un moteur de template tel que
  667. <ulink url="http://smarty.php.net/">Smarty</ulink>.
  668. </para>
  669. <para>
  670. Pour ceci, imaginons que le base path soit fixé à
  671. "<filename>/opt/vendor/templates</filename>", et
  672. que vous voulez que vos scripts de vues soit référencés par
  673. "<filename>:moduleDir/:controller/:action.:suffix</filename>"; si le paramètre
  674. <emphasis>noController</emphasis> est activé, vous désirez utiliser le dossier
  675. plus haut "<filename>:action.:suffix</filename>". Enfin,
  676. vous désirez un suffixe en "tpl"&#160;:
  677. </para>
  678. <programlisting language="php"><![CDATA[
  679. /**
  680. * Dans le fichier de démarrage :
  681. */
  682. // Une implémentation personnalisée de la vue
  683. $view = new ZF_Smarty();
  684. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  685. $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
  686. ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
  687. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  688. ->setViewSuffix('tpl');
  689. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  690. ]]></programlisting>
  691. </example>
  692. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
  693. <title>Rendu de plusieurs scripts de vue dans une même action</title>
  694. <para>
  695. Afin de rendre plusieurs scripts de vue dans une même action, appelez tout
  696. simplement plusieurs fois <methodname>render()</methodname>&#160;:
  697. </para>
  698. <programlisting language="php"><![CDATA[
  699. class SearchController extends Zend_Controller_Action
  700. {
  701. public function resultsAction()
  702. {
  703. // Considérons $this->model comme étant un modèle valide
  704. $this->view->results = $this->model
  705. ->find($this->_getParam('query', '');
  706. // render() est proxiée vers ViewRenderer
  707. // Rend d'abord un formulaire, puis un résultat
  708. $this->render('form');
  709. $this->render('results');
  710. }
  711. public function formAction()
  712. {
  713. // Rien : ViewRenderer rend automatiquement un script de vue
  714. }
  715. }
  716. ]]></programlisting>
  717. </example>
  718. </sect4>
  719. </sect3>