资源插件

资源插件被认为是为Smarty提供特定的模板源或PHP组件的一种通常的方式。例如一些资源如:数据库、LDAP、共享内存、sockets等。

资源插件可以是在$plugins_dir目录中的一个文件(如resource.foobarxyz.php),或在运行时通过registerResource()来注册。两种方式你可以通过在模板中用foobarxyz:yourtemplate.tpl方式来获取到资源。

如果资源模板是不希望经Smarty编译器来处理的,那么该资源插件应该是继承于Smarty_Resource_Uncompiled。该资源的处理程序必须实现renderUncompiled(Smarty_Internal_Template $_template)函数。$_template是引用值,包含了当前模板的全部变量,这些变量值都可以通过$_template->smarty->getTemplateVars()来进行存取。这些资源可以简单地echo它们渲染的内容到输出流。如果Smarty设置了输出缓存,这些输出内容将被输出缓存捕获。参见例子:libs/sysplugins/smarty_internal_resource_php.php

如果资源插件的模板不能被缓存到磁盘,那么该资源插件应该是继承于Smarty_Resource_Recompiled。这些资源将在每次访问的时候都被编译,这会是不小的资源开销。参见例子:libs/sysplugins/smarty_internal_resource_eval.php


Example 18.10. 资源插件

  1. <?php
  2.  
  3. /**
  4. * MySQL Resource
  5. *
  6. * Resource Implementation based on the Custom API to use
  7. * MySQL as the storage resource for Smarty's templates and configs.
  8. *
  9. * Table definition:
  10. * <pre>CREATE TABLE IF NOT EXISTS `templates` (
  11. * `name` varchar(100) NOT NULL,
  12. * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13. * `source` text,
  14. * PRIMARY KEY (`name`)
  15. * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
  16. *
  17. * Demo data:
  18. * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
  19. *
  20. * @package Resource-examples
  21. * @author Rodney Rehm
  22. */
  23. class Smarty_Resource_Mysql extends Smarty_Resource_Custom {
  24. // PDO instance
  25. protected $db;
  26. // prepared fetch() statement
  27. protected $fetch;
  28. // prepared fetchTimestamp() statement
  29. protected $mtime;
  30.  
  31. public function __construct() {
  32. try {
  33. $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
  34. } catch (PDOException $e) {
  35. throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
  36. }
  37. $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
  38. $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
  39. }
  40.  
  41. /**
  42. * Fetch a template and its modification time from database
  43. *
  44. * @param string $name template name
  45. * @param string $source template source
  46. * @param integer $mtime template modification timestamp (epoch)
  47. * @return void
  48. */
  49. protected function fetch($name, &$source, &$mtime)
  50. {
  51. $this->fetch->execute(array('name' => $name));
  52. $row = $this->fetch->fetch();
  53. $this->fetch->closeCursor();
  54. if ($row) {
  55. $source = $row['source'];
  56. $mtime = strtotime($row['modified']);
  57. } else {
  58. $source = null;
  59. $mtime = null;
  60. }
  61. }
  62.  
  63. /**
  64. * Fetch a template's modification time from database
  65. *
  66. * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the comple template source.
  67. * @param string $name template name
  68. * @return integer timestamp (epoch) the template was modified
  69. */
  70. protected function fetchTimestamp($name) {
  71. $this->mtime->execute(array('name' => $name));
  72. $mtime = $this->mtime->fetchColumn();
  73. $this->mtime->closeCursor();
  74. return strtotime($mtime);
  75. }
  76. }
  77.  
  78.  
  79. require_once 'libs/Smarty.class.php';
  80. $smarty = new Smarty();
  81. $smarty->registerResource('mysql', new Smarty_Resource_Mysql());
  82.  
  83. // PHP中使用
  84. $smarty->display("mysql:index.tpl");
  85. ?>
  86.  

在模板中使用:

  1. {include file='mysql:extras/navigation.tpl'}
  2.  

参见: registerResource(), unregisterResource().

原文: https://www.smarty.net/docs/zh_CN/plugins.resources.tpl