Zend_Controller-ActionHelpers-ViewRenderer.xml 39 KB

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