2
0

Zend_Controller-ActionHelpers-ViewRenderer.xml 37 KB

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