Zend_Controller-ActionHelpers-ViewRenderer.xml 44 KB

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