Zend_View-Scripts.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.view.scripts">
  5. <title>Scripts de Visualização</title>
  6. <para>
  7. Uma vez que seu controlador tenha atribuido as variáveis e chamado o método
  8. <methodname>render()</methodname>, <classname>Zend_View</classname> incluirá o script de
  9. visualização requerido e o executará "dentro" do escopo da instância de
  10. <classname>Zend_View</classname>. Portanto, em seus scripts de visualização, as referências
  11. a $this apontarão para a própria instância de <classname>Zend_View</classname>.
  12. </para>
  13. <para>
  14. Variáveis atribuídas à visualização pelo controlador são referidas como propriedades de
  15. instância. Por exemplo, se o controlador atribuir a variável 'algumacoisa', você deve
  16. referir-se a ela como $this->algumacoisa em seu script de visualização. (Isto permite um
  17. rastreamento dos valores que foram atribuidos ao script, e que são internos ao mesmo).
  18. </para>
  19. <para>
  20. A fim de lembrar, aqui está um exemplo de script de visualização originado da introdução do
  21. <classname>Zend_View</classname>.
  22. </para>
  23. <programlisting language="php"><![CDATA[
  24. <?php if ($this->books): ?>
  25. <!-- Uma tabela contendo alguns livros. -->
  26. <table>
  27. <tr>
  28. <th>Autor</th>
  29. <th>Título</th>
  30. </tr>
  31. <?php foreach ($this->books as $key => $val): ?>
  32. <tr>
  33. <td><?php echo $this->escape($val['author']) ?></td>
  34. <td><?php echo $this->escape($val['title']) ?></td>
  35. </tr>
  36. <?php endforeach; ?>
  37. </table>
  38. <?php else: ?>
  39. <p>Não existem livros a serem exibidos.</p>
  40. <?php endif;?>
  41. ]]></programlisting>
  42. <sect2 id="zend.view.scripts.escaping">
  43. <title>Escapando a Saída</title>
  44. <para>
  45. Uma das tarefas mais importantes a ser executada por scripts de visualização é assegurar
  46. que a saída seja corretamente escapada; entre outras coisas, isto ajuda a evitar ataques
  47. do tipo site-cruzado. A menos que você esteja usando uma função, método, ou assistente
  48. que realize o escape, você sempre deverá escapar o conteúdo das variáveis antes de
  49. exibí-lo.
  50. </para>
  51. <para>
  52. <classname>Zend_View</classname> implementa um método chamado escape() que realiza
  53. corretamente o escape para você.
  54. </para>
  55. <programlisting language="php"><![CDATA[
  56. // maneira ruim:
  57. echo $this->variable;
  58. // maneira recomendada:
  59. echo $this->escape($this->variable);
  60. ]]></programlisting>
  61. <para>
  62. Por padrão, o método escape() usa a função htmlspecialchars() do <acronym>PHP</acronym>
  63. para fazer o escape. Mas, dependendo do seu ambiente, você pode desejar um comportamento
  64. diferente para o escape. Use o método setEscape() no nível do controlador para instruir
  65. o <classname>Zend_View</classname> sobre qual função de callback utilizar para fazer o
  66. escape.
  67. </para>
  68. <programlisting language="php"><![CDATA[
  69. // cria uma instância de Zend_View
  70. $view = new Zend_View();
  71. // instrui o uso de htmlentities como método de escape
  72. $view->setEscape('htmlentities');
  73. // ou instrui o uso de um método estático de classe
  74. $view->setEscape(array('SomeClass', 'methodName'));
  75. // ou mesmo um método de instância
  76. $obj = new SomeClass();
  77. $view->setEscape(array($obj, 'methodName'));
  78. // e renderiza a visualização
  79. echo $view->render(...);
  80. ]]></programlisting>
  81. <para>
  82. A função ou método de callback deverá tomar o valor a ser escapado como seu primeiro
  83. parâmetro, e os demais parâmetros deverão ser opcionais.
  84. </para>
  85. </sect2>
  86. <sect2 id="zend.view.scripts.templates">
  87. <title>Usando Sistemas de Template Alternativos</title>
  88. <para>
  89. Embora o <acronym>PHP</acronym> em si seja um poderoso sistema de template, muitos
  90. desenvolvedores sentiram que ele é muito potente ou complexo para seus designers de
  91. templates e acabam usando um motor de template alternativo.
  92. <classname>Zend_View</classname> fornece para isso dois mecanismos, o primeiro através
  93. de scripts de visualização, e o segundo implementando
  94. <classname>Zend_View_Interface</classname>.
  95. </para>
  96. <sect3 id="zend.view.scripts.templates.scripts">
  97. <title>Sistemas de Template Usando Scripts de Visualização</title>
  98. <para>
  99. Um script de visualização pode ser usado para instanciar e manipular um objeto de
  100. template separado, como um template do PHPLIB. O script de visualização para esse
  101. tipo de atividade pode ser algo como isto:
  102. </para>
  103. <programlisting language="php"><![CDATA[
  104. include_once 'template.inc';
  105. $tpl = new Template();
  106. if ($this->books) {
  107. $tpl->setFile(array(
  108. "booklist" => "booklist.tpl",
  109. "eachbook" => "eachbook.tpl",
  110. ));
  111. foreach ($this->books as $key => $val) {
  112. $tpl->set_var('author', $this->escape($val['author']);
  113. $tpl->set_var('title', $this->escape($val['title']);
  114. $tpl->parse("books", "eachbook", true);
  115. }
  116. $tpl->pparse("output", "booklist");
  117. } else {
  118. $tpl->setFile("nobooks", "nobooks.tpl")
  119. $tpl->pparse("output", "nobooks");
  120. }
  121. ]]></programlisting>
  122. <para>
  123. Estes seriam os arquivos de template relacionados:
  124. </para>
  125. <programlisting language="html"><![CDATA[
  126. <!-- booklist.tpl -->
  127. <table>
  128. <tr>
  129. <th>Autor</th>
  130. <th>Título</th>
  131. </tr>
  132. {books}
  133. </table>
  134. <!-- eachbook.tpl -->
  135. <tr>
  136. <td>{author}</td>
  137. <td>{title}</td>
  138. </tr>
  139. <!-- nobooks.tpl -->
  140. <p>Não existem livros a serem exibidos.</p>
  141. ]]></programlisting>
  142. </sect3>
  143. <sect3 id="zend.view.scripts.templates.interface">
  144. <title>Sistemas de Template Usando Zend_View_Interface</title>
  145. <para>
  146. Alguns podem achar mais fácil simplesmente fornecer um sistema de template
  147. compatível com <classname>Zend_View</classname>.
  148. <classname>Zend_View_Interface</classname> define a interface mínima necessária para
  149. a compatibilidade:
  150. </para>
  151. <programlisting language="php"><![CDATA[
  152. /**
  153. * Return the actual template engine object
  154. */
  155. public function getEngine();
  156. /**
  157. * Set the path to view scripts/templates
  158. */
  159. public function setScriptPath($path);
  160. /**
  161. * Set a base path to all view resources
  162. */
  163. public function setBasePath($path, $prefix = 'Zend_View');
  164. /**
  165. * Add an additional base path to view resources
  166. */
  167. public function addBasePath($path, $prefix = 'Zend_View');
  168. /**
  169. * Retrieve the current script paths
  170. */
  171. public function getScriptPaths();
  172. /**
  173. * Overloading methods for assigning template variables as object
  174. * properties
  175. */
  176. public function __set($key, $value);
  177. public function __isset($key);
  178. public function __unset($key);
  179. /**
  180. * Manual assignment of template variables, or ability to assign
  181. * multiple variables en masse.
  182. */
  183. public function assign($spec, $value = null);
  184. /**
  185. * Unset all assigned template variables
  186. */
  187. public function clearVars();
  188. /**
  189. * Render the template named $name
  190. */
  191. public function render($name);
  192. ]]></programlisting>
  193. <para>
  194. Usando essa interface, torna-se relativamente fácil envolver um sistema de template
  195. de terceiro como uma classe compatível com <classname>Zend_View</classname>. Como
  196. exemplo, o seguinte é um potencial envoltório para Smarty:
  197. </para>
  198. <programlisting language="php"><![CDATA[
  199. class Zend_View_Smarty implements Zend_View_Interface
  200. {
  201. /**
  202. * Smarty object
  203. * @var Smarty
  204. */
  205. protected $_smarty;
  206. /**
  207. * Constructor
  208. *
  209. * @param string $tmplPath
  210. * @param array $extraParams
  211. * @return void
  212. */
  213. public function __construct($tmplPath = null, $extraParams = array())
  214. {
  215. $this->_smarty = new Smarty;
  216. if (null !== $tmplPath) {
  217. $this->setScriptPath($tmplPath);
  218. }
  219. foreach ($extraParams as $key => $value) {
  220. $this->_smarty->$key = $value;
  221. }
  222. }
  223. /**
  224. * Return the template engine object
  225. *
  226. * @return Smarty
  227. */
  228. public function getEngine()
  229. {
  230. return $this->_smarty;
  231. }
  232. /**
  233. * Set the path to the templates
  234. *
  235. * @param string $path The directory to set as the path.
  236. * @return void
  237. */
  238. public function setScriptPath($path)
  239. {
  240. if (is_readable($path)) {
  241. $this->_smarty->template_dir = $path;
  242. return;
  243. }
  244. throw new Exception('Invalid path provided');
  245. }
  246. /**
  247. * Retrieve the current template directory
  248. *
  249. * @return string
  250. */
  251. public function getScriptPaths()
  252. {
  253. return array($this->_smarty->template_dir);
  254. }
  255. /**
  256. * Alias for setScriptPath
  257. *
  258. * @param string $path
  259. * @param string $prefix Unused
  260. * @return void
  261. */
  262. public function setBasePath($path, $prefix = 'Zend_View')
  263. {
  264. return $this->setScriptPath($path);
  265. }
  266. /**
  267. * Alias for setScriptPath
  268. *
  269. * @param string $path
  270. * @param string $prefix Unused
  271. * @return void
  272. */
  273. public function addBasePath($path, $prefix = 'Zend_View')
  274. {
  275. return $this->setScriptPath($path);
  276. }
  277. /**
  278. * Assign a variable to the template
  279. *
  280. * @param string $key The variable name.
  281. * @param mixed $val The variable value.
  282. * @return void
  283. */
  284. public function __set($key, $val)
  285. {
  286. $this->_smarty->assign($key, $val);
  287. }
  288. /**
  289. * Allows testing with empty() and isset() to work
  290. *
  291. * @param string $key
  292. * @return boolean
  293. */
  294. public function __isset($key)
  295. {
  296. return (null !== $this->_smarty->get_template_vars($key));
  297. }
  298. /**
  299. * Allows unset() on object properties to work
  300. *
  301. * @param string $key
  302. * @return void
  303. */
  304. public function __unset($key)
  305. {
  306. $this->_smarty->clear_assign($key);
  307. }
  308. /**
  309. * Assign variables to the template
  310. *
  311. * Allows setting a specific key to the specified value, OR passing
  312. * an array of key => value pairs to set en masse.
  313. *
  314. * @see __set()
  315. * @param string|array $spec The assignment strategy to use (key or
  316. * array of key => value pairs)
  317. * @param mixed $value (Optional) If assigning a named variable,
  318. * use this as the value.
  319. * @return void
  320. */
  321. public function assign($spec, $value = null)
  322. {
  323. if (is_array($spec)) {
  324. $this->_smarty->assign($spec);
  325. return;
  326. }
  327. $this->_smarty->assign($spec, $value);
  328. }
  329. /**
  330. * Clear all assigned variables
  331. *
  332. * Clears all variables assigned to Zend_View either via
  333. * {@link assign()} or property overloading
  334. * ({@link __get()}/{@link __set()}).
  335. *
  336. * @return void
  337. */
  338. public function clearVars()
  339. {
  340. $this->_smarty->clear_all_assign();
  341. }
  342. /**
  343. * Processes a template and returns the output.
  344. *
  345. * @param string $name The template to process.
  346. * @return string The output.
  347. */
  348. public function render($name)
  349. {
  350. return $this->_smarty->fetch($name);
  351. }
  352. }
  353. ]]></programlisting>
  354. <para>
  355. Neste exemplo, você poderia instanciar a classe
  356. <classname>Zend_View_Smarty</classname> em vez de <classname>Zend_View</classname>,
  357. e então usá-la aproximadamente da mesma maneira que
  358. <classname>Zend_View</classname>:
  359. </para>
  360. <programlisting language="php"><![CDATA[
  361. //Example 1. In initView() of initializer.
  362. $view = new Zend_View_Smarty('/path/to/templates');
  363. $viewRenderer =
  364. Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
  365. $viewRenderer->setView($view)
  366. ->setViewBasePathSpec($view->_smarty->template_dir)
  367. ->setViewScriptPathSpec(':controller/:action.:suffix')
  368. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  369. ->setViewSuffix('tpl');
  370. //Example 2. Usage in action controller remains the same...
  371. class FooController extends Zend_Controller_Action
  372. {
  373. public function barAction()
  374. {
  375. $this->view->book = 'Zend PHP 5 Certification Study Guide';
  376. $this->view->author = 'Davey Shafik and Ben Ramsey'
  377. }
  378. }
  379. //Example 3. Initializing view in action controller
  380. class FooController extends Zend_Controller_Action
  381. {
  382. public function init()
  383. {
  384. $this->view = new Zend_View_Smarty('/path/to/templates');
  385. $viewRenderer = $this->_helper->getHelper('viewRenderer');
  386. $viewRenderer->setView($this->view)
  387. ->setViewBasePathSpec($view->_smarty->template_dir)
  388. ->setViewScriptPathSpec(':controller/:action.:suffix')
  389. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  390. ->setViewSuffix('tpl');
  391. }
  392. ]]></programlisting>
  393. </sect3>
  394. </sect2>
  395. </sect1>
  396. <!--
  397. vim:se ts=4 sw=4 et:
  398. -->