Zend_Controller-ActionHelpers-ViewRenderer.xml 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17597 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.viewrenderer">
  5. <title>ViewRenderer</title>
  6. <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
  7. <title>Introducción</title>
  8. <para>El ayudante <emphasis>ViewRenderer</emphasis> está diseñado
  9. para satisfacer los siguientes objetivos:</para>
  10. <itemizedlist>
  11. <listitem>
  12. <para>Eliminar la necesidad de instanciar objetos de vista
  13. dentro de los controladores; los objetos de vista quedarán
  14. registrados automáticamente con el contralor.</para>
  15. </listitem>
  16. <listitem>
  17. <para>Establece automáticamente el script de vista, el
  18. ayudante, y los paths de los filtros basados en el módulo
  19. actual. Asocia automáticamente el nombre del módulo actual
  20. como un prefijo de clase para las clases ayudante y filtro.
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>Crea un objeto de vista, disponible globalmente para
  25. todos los controladores y acciones despachados.</para>
  26. </listitem>
  27. <listitem>
  28. <para>Permite al desarrollador establecer por defecto las
  29. opciones de renderizado para todos los controladores.
  30. </para>
  31. </listitem>
  32. <listitem>
  33. <para>Agrega la capacidad para renderizar automáticamente los
  34. scripts de vista sin ninguna intervención.</para>
  35. </listitem>
  36. <listitem>
  37. <para>Permite al desarrollador crear sus propias
  38. especificaciones para el path base de vistas y para el path
  39. de los scripts de vista.</para>
  40. </listitem>
  41. </itemizedlist>
  42. <note>
  43. <para>Si realiza un <methodname>_forward()</methodname>,
  44. redirecciona, o <methodname>render</methodname> manualmente, el
  45. autorendering no se llevará a cabo, como está realizando
  46. cualquiera de estas acciones le está diciendo al
  47. <emphasis>ViewRenderer</emphasis> que usted está
  48. determinando su propia salida.</para>
  49. </note>
  50. <note>
  51. <para>El <emphasis>ViewRenderer</emphasis> está habilitado por
  52. defecto. Puede desactivarlo vía parámetro del front controller
  53. <emphasis>noViewRenderer</emphasis>
  54. (<command>$front->setParam('noViewRenderer',
  55. true)</command>) o eliminando al ayudante del stack de
  56. ayudantes
  57. (<methodname>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</methodname>).</para>
  58. <para>Si desea modificar los settings del
  59. <emphasis>ViewRenderer</emphasis> antes de despachar el
  60. front controller, puede hacerlo en una de las dos maneras:</para>
  61. <itemizedlist>
  62. <listitem>
  63. <para>Instanciar y registrar su propio objeto
  64. <emphasis>ViewRenderer</emphasis> y pasarlo al
  65. ayudante:</para>
  66. <programlisting language="php"><![CDATA[
  67. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
  68. $viewRenderer->setView($view)
  69. ->setViewSuffix('php');
  70. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  71. ]]></programlisting>
  72. </listitem>
  73. <listitem>
  74. <para>Inicializar y/o recuperar un objeto
  75. <methodname>ViewRenderer</methodname> por demanda
  76. via el ayudante:</para>
  77. <programlisting language="php"><![CDATA[
  78. $viewRenderer =
  79. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  80. $viewRenderer->setView($view)
  81. ->setViewSuffix('php');
  82. ]]></programlisting>
  83. </listitem>
  84. </itemizedlist>
  85. </note>
  86. </sect4>
  87. <sect4 id="zend.controller.actionhelper.viewrenderer.api">
  88. <title>API</title>
  89. <para>En su uso más básico, simplemente instancie a
  90. <methodname>ViewRenderer</methodname> y páselo al ayudante de
  91. acciones. La forma más fácil para instanciar y registrar de una sola
  92. vez es utilizando el método del ayudante
  93. <methodname>getStaticHelper()</methodname>:</para>
  94. <programlisting language="php"><![CDATA[
  95. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  96. ]]></programlisting>
  97. <para>La primera vez que se instancia un controlador de acción, se
  98. disparará <emphasis>ViewRenderer</emphasis> para instanciar al
  99. objeto vista. Cada vez que el controlador es instanciado, se llama
  100. al método <methodname>init()</methodname> de
  101. <emphasis>ViewRenderer</emphasis>, que lo llevará a
  102. establecer la propiedad del controlador de acción, y llama a
  103. <methodname>addScriptPath()</methodname> con un path relativo al
  104. módulo actual; este será llamado con un prefijo de clase nombrada
  105. después del módulo actual, haciendo efectivamente el namespacing de
  106. todas las clases de ayudantes y filtros que define para el módulo.</para>
  107. <para>Cad vez que llama a <methodname>postDispatch()</methodname>, este
  108. llamará a <methodname>render()</methodname> para la acción actual.</para>
  109. <para>Como ejemplo, considere la siguiente clase:</para>
  110. <programlisting language="php"><![CDATA[
  111. // Una clase controlador, módulo foo:
  112. class Foo_BarController extends Zend_Controller_Action
  113. {
  114. // Render bar/index.phtml por defecto; no se requiere acción
  115. public function indexAction()
  116. {
  117. }
  118. // Render bar/populate.phtml con la variable 'foo' establecida a 'bar'.
  119. // Dado que el objeto vista está definido en preDispatch(),
  120. // ya está disponible.
  121. public function populateAction()
  122. {
  123. $this->view->foo = 'bar';
  124. }
  125. }
  126. ...
  127. // en uno de sus scripts de vista:
  128. $this->foo(); // llama a Foo_View_Helper_Foo::foo()
  129. ]]></programlisting>
  130. <para>El <emphasis>ViewRenderer</emphasis> también define una serie
  131. de accededores para permitir establecer y recuperar opciones de
  132. vista:</para>
  133. <itemizedlist>
  134. <listitem>
  135. <para>
  136. <methodname>setView($view)</methodname> le permite
  137. establecer el objeto vista para
  138. <emphasis>ViewRenderer</emphasis>. Se vuelve como
  139. una propiedad de clase pública
  140. <varname>$view</varname>.</para>
  141. </listitem>
  142. <listitem>
  143. <para>
  144. <methodname>setNeverRender($flag = true)</methodname> puede
  145. ser utilizado para activar o desactivar globalmente el
  146. autorendering, es decir, para todos los controladores. Si es
  147. verdadero, <methodname>postDispatch()</methodname> no
  148. llamará automáticamente a <methodname>render()</methodname>
  149. en el controlador actual.
  150. <methodname>getNeverRender()</methodname> recupera el
  151. valor actual.</para>
  152. </listitem>
  153. <listitem>
  154. <para>
  155. <methodname>setNoRender($flag = true)</methodname> puede ser
  156. utilizado para activar o desactivar el autorendering. Si es
  157. verdadero, <methodname>postDispatch()</methodname> no
  158. llamará automáticamente a <methodname>render()</methodname>
  159. en el controlador actual. Este ajuste se reseteará cada vez
  160. que se llame a <methodname>preDispatch()</methodname> (es
  161. decir, usted necesita establecer este flag para cada
  162. controlador para el cual no quiera que el autorenderering se
  163. ejecute). <methodname>getNoRender()</methodname> recupera el
  164. valor actual.</para>
  165. </listitem>
  166. <listitem>
  167. <para>
  168. <methodname>setNoController($flag = true)</methodname> pude
  169. ser usado para decirle a <methodname>render()</methodname>
  170. que no busque el script de acción en un subdirectorio
  171. nombrado después de que el controlador (que es el
  172. comportamiento por defecto)
  173. <methodname>getNoController()</methodname> recupere el
  174. valor actual.</para>
  175. </listitem>
  176. <listitem>
  177. <para>
  178. <methodname>setNeverController($flag = true)</methodname> es
  179. análogo a <methodname>setNoController()</methodname>, pero
  180. trabaja a un nivel global -- es decir, que no se reseteará
  181. por cada acción ejecutada.
  182. <methodname>getNeverController()</methodname> recupera
  183. el valor actual.</para>
  184. </listitem>
  185. <listitem>
  186. <para>
  187. <methodname>setScriptAction($name)</methodname> puede ser
  188. utilizado para especificar el script de acción a renderizar.
  189. <varname>$name</varname> debe ser el nombre del
  190. script menos el sufijo del archivo (y sin el subdirectorio
  191. del controlador, a menos que
  192. <emphasis>noController</emphasis> se haya activado).
  193. Si no se ha especificado, busca un script de vista nombrado
  194. después de la acción en el objeto solicitud.
  195. <methodname>getScriptAction()</methodname> recupera el
  196. valor actual.</para>
  197. </listitem>
  198. <listitem>
  199. <para>
  200. <methodname>setResponseSegment($name)</methodname> puede ser
  201. utilizado para especificar qué segmento del objeto respuesta
  202. nombrado renderizar. Si no se especifica, se hace en el
  203. segmento por defecto.
  204. <methodname>getResponseSegment()</methodname> recupera
  205. el valor actual.</para>
  206. </listitem>
  207. <listitem>
  208. <para>
  209. <methodname>initView($path, $prefix, $options)</methodname>
  210. puede ser llamado para especificar el path base de las
  211. vistas, prefijos de clase para scripts de ayudantes y
  212. filtros, y las opciones de
  213. <emphasis>ViewRenderer</emphasis>. Puede pasar
  214. cualquiera de los siguientes flags:
  215. <emphasis>neverRender</emphasis>,
  216. <emphasis>noRender</emphasis>,
  217. <emphasis>noController</emphasis>,
  218. <emphasis>scriptAction</emphasis>, y
  219. <emphasis>responseSegment</emphasis>.</para>
  220. </listitem>
  221. <listitem>
  222. <para>
  223. <methodname>setRender($action = null, $name = null,
  224. $noController = false)</methodname> le permite
  225. establecer cualquier <emphasis>scriptAction</emphasis>,
  226. <emphasis>responseSegment</emphasis>, y
  227. <emphasis>noController</emphasis> en un pase.
  228. <methodname>direct()</methodname> es un alias a este
  229. método, permitiéndole llamar a este método fácilmente dede
  230. su controlador:</para>
  231. <programlisting language="php"><![CDATA[
  232. // Render 'foo' en lugar del script de acción actual
  233. $this->_helper->viewRenderer('foo');
  234. // render form.phtml al segmento de respuesta de 'html', sin usar un
  235. // subdirectorio de scripts de controladores de acción:
  236. $this->_helper->viewRenderer('form', 'html', true);
  237. ]]></programlisting>
  238. <note>
  239. <para>
  240. <methodname>setRender()</methodname> y
  241. <methodname>direct()</methodname> realmente no
  242. renderiza el script de vista, sino que establece
  243. indicaciones que <methodname>postDispatch()</methodname>
  244. y <methodname>render()</methodname> utlizarán para
  245. renderizar la vista.</para>
  246. </note>
  247. </listitem>
  248. </itemizedlist>
  249. <para>El constructor le permite opcionalmente pasar el objeto vista y
  250. las opciones de <emphasis>ViewRenderer</emphasis>; acepta los
  251. mismos flags que <methodname>initView()</methodname>:</para>
  252. <programlisting language="php"><![CDATA[
  253. $view = new Zend_View(array('encoding' => 'UTF-8'));
  254. $options = array('noController' => true, 'neverRender' => true);
  255. $viewRenderer =
  256. new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
  257. ]]></programlisting>
  258. <para>Hay varios métodos adicionales para personalizar especificaciones
  259. del path, usados para determinar el path base del script de vista
  260. para añadir al objeto vista, y el path del script de vista a usar
  261. cuando esté autodeterminando el script de vista a renderizar. Cada
  262. uno de estos métodos toma uno o más de los siguientes localizadores:</para>
  263. <itemizedlist>
  264. <listitem>
  265. <para>
  266. <emphasis>:moduleDir</emphasis> hace referencia a la
  267. actual directorio base del módulo(por convención, el
  268. directorio padre del directorio del módulo controlador).
  269. </para>
  270. </listitem>
  271. <listitem>
  272. <para>
  273. <emphasis>:module</emphasis> hace referencia al nombre
  274. del módulo actual.</para>
  275. </listitem>
  276. <listitem>
  277. <para>
  278. <emphasis>:controller</emphasis> hace referencia al
  279. nombre del controlador actual.</para>
  280. </listitem>
  281. <listitem>
  282. <para>
  283. <emphasis>:action</emphasis> hace referencia al nombre
  284. de la acción actual.</para>
  285. </listitem>
  286. <listitem>
  287. <para>
  288. <emphasis>:suffix</emphasis> hace referencia al sufijo
  289. del script de vista (que puede ser definido via
  290. <methodname>setViewSuffix()</methodname>).</para>
  291. </listitem>
  292. </itemizedlist>
  293. <para>Los métodos para controlar las especificaciones del path son:</para>
  294. <itemizedlist>
  295. <listitem>
  296. <para>
  297. <methodname>setViewBasePathSpec($spec)</methodname> le
  298. permite cambiar la especificación del path utilizada para
  299. determinar el path base para añadir al objeto vista. La
  300. especificación por defecto es
  301. <filename>:moduleDir/views</filename>. Puede
  302. recuperar la especificación actual en cualquier momento
  303. usando <methodname>getViewBasePathSpec()</methodname>.
  304. </para>
  305. </listitem>
  306. <listitem>
  307. <para>
  308. <methodname>setViewScriptPathSpec($spec)</methodname> le
  309. permite cambiar el path de la especificación utilizada para
  310. determinar el path a un script de vista individual (menos el
  311. path de la base del script de vista). La especificación por
  312. defecto es
  313. <filename>:controller/:action.:suffix</filename>.
  314. Puede recuperar la especificación actual en cualquier
  315. momento usando
  316. <methodname>getViewScriptPathSpec()</methodname>.
  317. </para>
  318. </listitem>
  319. <listitem>
  320. <para>
  321. <methodname>setViewScriptPathNoControllerSpec($spec)</methodname>
  322. le permite cambiar el path de la especificación utilizado
  323. para determinar el path a un script de vista individual
  324. cuando <emphasis>noController</emphasis> está activado
  325. (menos el path base del script de vista). La especificación
  326. por defecto es <filename>:action.:suffix</filename>.
  327. Puede recuperar la especificación actual en cualquier
  328. momento usando
  329. <methodname>getViewScriptPathNoControllerSpec()</methodname>.
  330. </para>
  331. </listitem>
  332. </itemizedlist>
  333. <para>Para un control más refinado sobre el path de especificaciones,
  334. puede usar <link linkend="zend.filter.inflector"
  335. >Zend_Filter_Inflector</link>. Bajo el capó,
  336. <emphasis>ViewRenderer</emphasis> ya usa un inflector para
  337. realizar mapeos del path. Para interactuar con el inflector -- ya
  338. sea para establecerlo para uso propio, o para modificar el inflector
  339. por defecto, se pueden utilizar los siguientes métodos:</para>
  340. <itemizedlist>
  341. <listitem>
  342. <para>
  343. <methodname>getInflector()</methodname> recupera el
  344. inflector. Si no existe todavía en
  345. <emphasis>ViewRenderer</emphasis>, se crea uno
  346. utilizando las reglas predeterminadas.</para>
  347. <para>Por defecto, utiliza reglas de referencias estáticas para
  348. el sufijo y directorio de módulos, así como una meta
  349. estática; esto permite que diversas propiedades de
  350. <emphasis>ViewRenderer</emphasis> tengan la
  351. capacidad de modificar dinámicamente al inflector.</para>
  352. </listitem>
  353. <listitem>
  354. <para>
  355. <methodname>setInflector($inflector,
  356. $reference)</methodname> permite establecer un inflector
  357. personalizado para usar con
  358. <emphasis>ViewRenderer</emphasis>. Si
  359. <varname>$reference</varname> es verdadero,
  360. establecerá el sufijo y directorio de módulos como
  361. referencias estáticas a las propiedades de
  362. <emphasis>ViewRenderer</emphasis>, así como al
  363. objetivo.</para>
  364. </listitem>
  365. </itemizedlist>
  366. <note>
  367. <title>Convenciones por Defecto para Lookup</title>
  368. <para>El <emphasis>ViewRenderer</emphasis> hace algún tipo de
  369. normalización del path para facilitar la búsqueda de los scripts
  370. de vista. Las reglas predeterminadas son los siguientes:</para>
  371. <itemizedlist>
  372. <listitem>
  373. <para>
  374. <filename>:module</filename>: MixedCase y
  375. camelCasedWords están separados por guiones, y el string
  376. completo se convierte a minúsculas. Por ejemplo:
  377. "FooBarBaz" pasa a ser "foo-bar-baz".</para>
  378. <para>Internamente, el inflector utiliza los filtros
  379. <classname>Zend_Filter_Word_CamelCaseToDash</classname>
  380. y <classname>Zend_Filter_StringToLower</classname>.
  381. </para>
  382. </listitem>
  383. <listitem>
  384. <para>
  385. <filename>:controller</filename>: MixedCase y
  386. camelCasedWords están separados por guiones; los
  387. subrayados se convierten en separadores de directorio ,
  388. y el string emitido a minúsculas. Ejemplos: "<classname>FooBar</classname>"
  389. pasa a ser "foo-bar"; "<classname>FooBar_Admin</classname>" pasa a ser
  390. "<filename>foo-bar/admin</filename>".</para>
  391. <para>Internamente, el inflector utiliza los filtros
  392. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  393. <classname>Zend_Filter_Word_UnderscoreToSeparator</classname>,
  394. y <classname>Zend_Filter_StringToLower</classname>.
  395. </para>
  396. </listitem>
  397. <listitem>
  398. <para>
  399. <emphasis>:action</emphasis>: MixedCase y
  400. camelCasedWords están separados por guiones; los
  401. caracteres no alfanuméricos son traducidos a guiones, y
  402. el string emitido a minúsculas. Ejemplos: "fooBar" pasa
  403. a ser "foo-bar"; "foo-barBaz" pasa a ser "foo-bar-baz".</para>
  404. <para>Internamente, el inflector utiliza los filtros
  405. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  406. <classname>Zend_Filter_PregReplace</classname>, y
  407. <classname>Zend_Filter_StringToLower</classname>.
  408. </para>
  409. </listitem>
  410. </itemizedlist>
  411. </note>
  412. <para>Los últimos temas en la <acronym>API</acronym> de
  413. <emphasis>ViewRenderer</emphasis> son los métodos para
  414. determinar realmente los paths de los scripts de vista y el
  415. rendering de las vistas. Estos incluyen:</para>
  416. <itemizedlist>
  417. <listitem>
  418. <para>
  419. <methodname>renderScript($script, $name)</methodname>
  420. permite renderizar un script con una ruta que especifique,
  421. opcionalmente a un segmento nombrado del path. Cuando se
  422. utiliza este método, <emphasis>ViewRenderer</emphasis>
  423. no autodetermina el nombre del script, en cambio pasa
  424. directamente a <varname>$script</varname> el argumento
  425. directamente al método del objeto vista
  426. <methodname>render()</methodname>.</para>
  427. <note>
  428. <para>Una vez que la vista ha sido renderizada al objeto
  429. respuesta, se establece
  430. <methodname>noRender</methodname> para evitar
  431. accidentalmente renderizar el mismo script de vista
  432. varias veces.</para>
  433. </note>
  434. <note>
  435. <para>Por defecto,
  436. <methodname>Zend_Controller_Action::renderScript()</methodname>
  437. le delega a <emphasis>ViewRenderer</emphasis> el
  438. método <methodname>renderScript()</methodname>.</para>
  439. </note>
  440. </listitem>
  441. <listitem>
  442. <para>
  443. <methodname>getViewScript($action, $vars)</methodname> crea
  444. el path a un script de vista basado en la acción pasada y/o
  445. cualquier variables pasadas en
  446. <methodname>$vars</methodname>. Las claves para este
  447. array pueden incluir cualquiera de las claves de
  448. especificación de paths ('moduleDir', 'module',
  449. 'controller', 'action', y 'suffix'). Se utilizarán
  450. cualquiera de la variables pasadas; de lo contrario, se
  451. utilizarán valores basados en la petición actual.</para>
  452. <para>
  453. <emphasis>getViewScript()</emphasis> utilizará tanto a
  454. <emphasis>viewScriptPathSpec</emphasis> o
  455. <emphasis>viewScriptPathNoControllerSpec</emphasis>
  456. sobre la base establecida del flag
  457. <emphasis>noController</emphasis>.</para>
  458. <para>Los delimitadores de palabras encontrados en un módulo,
  459. controlador o nombres de acción serán reemplazados por
  460. guiones ('-'). Así pues, si tiene el nombre de controlador
  461. '<command>foo.bar</command>' y la acción '<command>baz:bat</command>', utilizando la
  462. especificación por defecto del path se traducirá en un path
  463. al script de vista '<filename>foo-bar/baz-bat.phtml</filename>'.</para>
  464. <note>
  465. <para>Por defecto,
  466. <methodname>Zend_Controller_Action::getViewScript()</methodname>
  467. delega el método
  468. <methodname>getViewScript()</methodname> de
  469. <emphasis>ViewRenderer</emphasis>.</para>
  470. </note>
  471. </listitem>
  472. <listitem>
  473. <para>
  474. <methodname>render($action, $name,
  475. $noController)</methodname> comprueba primero para ver
  476. si bien <methodname>$name</methodname> o
  477. <varname>$noController</varname> se han pasado, y
  478. si es así, establece los flags apropiados (responseSegment y
  479. noController, respectivamente) en <emphasis>ViewRenderer</emphasis>. A
  480. continuación, pasa el argumento
  481. <varname>$action</varname>, si hay alguno, a
  482. <methodname>getViewScript()</methodname>. Por último,
  483. pasa el path calculado del script de vista a
  484. <methodname>renderScript()</methodname>.</para>
  485. <note>
  486. <para>Hay que ser conscientes de los efectos secundarios al
  487. usar <methodname>render()</methodname>: los valores que usted pasa para el nombre
  488. del segmento respuesta y para el flag noController
  489. persistirán en el objeto. Además, noRender será
  490. establecido después de completar la renderización.
  491. </para>
  492. </note>
  493. <note>
  494. <para>Por defecto,
  495. <methodname>Zend_Controller_Action::render()</methodname>
  496. delega a <emphasis>ViewRenderer</emphasis> el método
  497. <methodname>render()</methodname>.</para>
  498. </note>
  499. </listitem>
  500. <listitem>
  501. <para>
  502. <methodname>renderBySpec($action, $vars, $name)</methodname>
  503. permite pasar variables de especificación del path a fin de
  504. determinar el path para la creación del script de vista.
  505. Este pasa <methodname>$action</methodname> y
  506. <varname>$vars</varname> a
  507. <methodname>getScriptPath()</methodname>, y luego pasa
  508. el path del script resultante y
  509. <varname>$name</varname> a
  510. <methodname>renderScript()</methodname>.</para>
  511. </listitem>
  512. </itemizedlist>
  513. </sect4>
  514. <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
  515. <title>Ejemplos Uso Básico</title>
  516. <example
  517. id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
  518. <title>Uso Básico</title>
  519. <para>En lo más básico, usted simplemente inicializa y registra el
  520. ayudante <emphasis>ViewRenderer</emphasis> con el ayudante
  521. broker en su bootstrap, y luego establecer las variables en sus
  522. métodos de acción.</para>
  523. <programlisting language="php"><![CDATA[
  524. // En su bootstrap:
  525. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  526. ...
  527. // 'foo' módulo, 'bar' controlador:
  528. class Foo_BarController extends Zend_Controller_Action
  529. {
  530. // Render bar/index.phtml por defecto; no se requieren acciones
  531. public function indexAction()
  532. {
  533. }
  534. // Render bar/populate.phtml la variable 'foo' establecida a 'bar'.
  535. // Dado que el objeto fue definido en preDispatch(), está disponible.
  536. public function populateAction()
  537. {
  538. $this->view->foo = 'bar';
  539. }
  540. // No hace rendering, ya que salta a otra acción; la nueva acción
  541. // realizará cualquier rendering
  542. public function bazAction()
  543. {
  544. $this->_forward('index');
  545. }
  546. // No hace rendering, ya que redirecciona a otra ubicación
  547. public function batAction()
  548. {
  549. $this->_redirect('/index');
  550. }
  551. }
  552. ]]></programlisting>
  553. </example>
  554. <note>
  555. <title>Convenciones de Nombres: Delimitadores de Palabras en
  556. Controladores y Nombres de Acción</title>
  557. <para>Si su controlador o nombre de acción está compuesto por
  558. varias palabras, el despachador exige que estos sean separados
  559. de la <acronym>URL</acronym> por un path específico y caracteres
  560. delimitadores de palabras. El
  561. <emphasis>ViewRenderer</emphasis> reemplaza cualquier
  562. delimitador de paths encontrado en el nombre del controlador con
  563. el delimitador actual ('/'), y cualquier delimitador de palabra
  564. encontrado con un guión ('-') cuando crea paths. Así, una
  565. llamada a la acción <filename>/foo.bar/baz.bat</filename>
  566. despachará a
  567. <methodname>FooBarController::bazBatAction()</methodname> en
  568. <filename>FooBarController.php</filename>, el cual renderizaría a
  569. <filename>foo-bar/baz-bat.phtml</filename>; una llamada
  570. a la acción <filename>/bar_baz/baz-bat</filename> despachará
  571. a <methodname>Bar_BazController::bazBatAction()</methodname> en
  572. <methodname>Bar/BazController.php</methodname> (note la
  573. separación del path) y renderiza
  574. <filename>bar/baz/baz-bat.phtml</filename>.</para>
  575. <para>Tener en cuenta que el en el segundo ejemplo, el módulo es
  576. todavía el módulo por defecto, pero que, debido a la existencia
  577. de un separador de paths, el controlador recibe el nombre
  578. <methodname>Bar_BazController</methodname>, en
  579. <filename>Bar/BazController.php</filename>. El
  580. <emphasis>ViewRenderer</emphasis> imita la jerarquía del directorio del controlador.
  581. </para>
  582. </note>
  583. <example
  584. id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
  585. <title>Deshabilitando Autorender</title>
  586. <para>Para algunas acciones o controladores, usted puede querer
  587. apagar el autorendering -- por ejemplo, si quiere emitir un tipo
  588. diferente de salida (<acronym>XML</acronym>, <acronym>JSON</acronym>, etc), o si simplemente no desea
  589. emitir nada. Tiene dos opciones: apagar todos los casos de
  590. autorendering (<methodname>setNeverRender()</methodname>), o
  591. simplemente desactivarlo para la acción actual
  592. (<methodname>setNoRender()</methodname>).</para>
  593. <programlisting language="php"><![CDATA[
  594. // Baz clase del controlador, bar módulo:
  595. class Bar_BazController extends Zend_Controller_Action
  596. {
  597. public function fooAction()
  598. {
  599. // No auto renderize esta acción
  600. $this->_helper->viewRenderer->setNoRender();
  601. }
  602. }
  603. // Bat clase del controlador, bar módulo:
  604. class Bar_BatController extends Zend_Controller_Action
  605. {
  606. public function preDispatch()
  607. {
  608. // Nunca auto renderizar las acciones de este controlador
  609. $this->_helper->viewRenderer->setNoRender();
  610. }
  611. }
  612. ]]></programlisting>
  613. </example>
  614. <note>
  615. <para>En muchos casos, no tiene sentido desactivar el autorendering
  616. globalmente (ala <methodname>setNeverRender()</methodname>), y
  617. la única cosa que puede ganar de
  618. <emphasis>ViewRenderer</emphasis> es el autosetup del
  619. objeto de vista.</para>
  620. </note>
  621. <example
  622. id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
  623. <title>Eligiendo Un Script de Vista Diferente</title>
  624. <para>Algunas situaciones requieren renderizar un script diferente
  625. al llamado después de la acción. Por ejemplo, si tiene un
  626. controlador que tiene tanto las acciones de agregar y de editar,
  627. ambos pueden mostrar la misma vista 'form', aunque con
  628. diferentes valores establecidos. Puede cambiar fácilmente el
  629. nombre del script usado tanto con
  630. <methodname>setScriptAction()</methodname>,
  631. <methodname>setRender()</methodname>, o llamando al ayudante
  632. como un método, que invocará a
  633. <methodname>setRender()</methodname>.</para>
  634. <programlisting language="php"><![CDATA[
  635. // Bar clase controlador, foo módulo:
  636. class Foo_BarController extends Zend_Controller_Action
  637. {
  638. public function addAction()
  639. {
  640. // Render 'bar/form.phtml' en lugar de 'bar/add.phtml'
  641. $this->_helper->viewRenderer('form');
  642. }
  643. public function editAction()
  644. {
  645. // Render 'bar/form.phtml' en lugar de 'bar/edit.phtml'
  646. $this->_helper->viewRenderer->setScriptAction('form');
  647. }
  648. public function processAction()
  649. {
  650. // hacer alguna validación...
  651. if (!$valid) {
  652. // Render 'bar/form.phtml' en lugar de 'bar/process.phtml'
  653. $this->_helper->viewRenderer->setRender('form');
  654. return;
  655. }
  656. // de otra manera, continuar procesando...
  657. }
  658. }
  659. ]]></programlisting>
  660. </example>
  661. <example
  662. id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
  663. <title>Modificando la Vista Registrada</title>
  664. <para>¿Y si se necesita modificar el objeto vista -- por ejemplo,
  665. cambiar el ayudante de paths, o la codificación?. Puede hacerlo
  666. ya sea por modificar el objeto vista establecido en su
  667. controlador, o arrebatándole el objeto vista a
  668. <emphasis>ViewRenderer</emphasis>; ambas son referencias
  669. al mismo objeto.</para>
  670. <programlisting language="php"><![CDATA[
  671. // Bar clase controlador, foo módulo:
  672. class Foo_BarController extends Zend_Controller_Action
  673. {
  674. public function preDispatch()
  675. {
  676. // cambiar la codificavión de la vista
  677. $this->view->setEncoding('UTF-8');
  678. }
  679. public function bazAction()
  680. {
  681. // Obtener el objeto vista y establecer
  682. // el callback de escape a 'htmlspecialchars'
  683. $view = $this->_helper->viewRenderer->view;
  684. $view->setEscape('htmlspecialchars');
  685. }
  686. }
  687. ]]></programlisting>
  688. </example>
  689. </sect4>
  690. <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
  691. <title>Ejemplos de Uso Avanzado</title>
  692. <example
  693. id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
  694. <title>Cambiando las Especificaciones del Path</title>
  695. <para>En algunas circunstancias, puede decidir que las
  696. especificaciones del path por defecto no se adaptan a su sitio.
  697. Por ejemplo, usted puede querer tener un árbol único de
  698. plantillas al que puede dar acceso a sus diseñadores (esto es
  699. muy típico cuando se utiliza <ulink url="http://smarty.php.net/"
  700. >Smarty</ulink>, por ejemplo). En ese caso, puede querer
  701. embeber los datos de la especificación del path base de la
  702. vista, y crear una especificación alternativa para el script de
  703. vista del path ellos mismos.</para>
  704. <para>Para los fines de este ejemplo, supongamos que el path base
  705. de las vistas debería ser '<filename>/opt/vendor/templates</filename>', y que desea
  706. para que los scripts de vista sean referenciados por
  707. '<filename>:moduleDir/:controller/:action.:suffix</filename>'; si el flag
  708. <emphasis>noController</emphasis> ha sido establecido, quiere renderizar fuera del
  709. nivel superior en lugar de en un subdirectorio
  710. (<filename>':action.:suffix</filename>'). Por último, que quiere utilizar 'tpl' como
  711. el sufijo del nombre de archivo del script de vista.</para>
  712. <programlisting language="php"><![CDATA[
  713. /**
  714. * En su bootstrap:
  715. */
  716. // Implementación de una vista diferente
  717. $view = new ZF_Smarty();
  718. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  719. $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
  720. ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
  721. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  722. ->setViewSuffix('tpl');
  723. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  724. ]]></programlisting>
  725. </example>
  726. <example
  727. id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
  728. <title>Rendering Múltiples Scripts de Vista desde una Sola
  729. Acción</title>
  730. <para>A veces, puede que necesite renderizar múltiples scripts de
  731. vista desde una sola acción. Esto es muy sencillo -- simplemente
  732. hacer múltiples llamadas a <methodname>render()</methodname>:</para>
  733. <programlisting language="php"><![CDATA[
  734. class SearchController extends Zend_Controller_Action
  735. {
  736. public function resultsAction()
  737. {
  738. // Suponga que $this->model es el modelo actual
  739. $this->view->results =
  740. $this->model->find($this->_getParam('query', '');
  741. // render() por defecto lo delega al ViewRenderer
  742. // Render primero al from de búsqueda y luego los resultados
  743. $this->render('form');
  744. $this->render('results');
  745. }
  746. public function formAction()
  747. {
  748. // No hacer nada; ViewRenderer hace autorender del script de vista
  749. }
  750. }
  751. ]]></programlisting>
  752. </example>
  753. </sect4>
  754. </sect3>