Zend_Controller-ActionHelpers-ViewRenderer.xml 39 KB

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