2
0

Zend_Controller-ActionHelpers-ViewRenderer.xml 32 KB

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