自定义模板资源

你可以通过任何可访问的来源来提供模板,如数据库,网络sockets,文件等,编写这些来源的资源插件并将他们注册到Smarty。

参见资源插件

Note

注意你不能覆盖内置的file:资源, 但你可以设计一个基于文件系统的资源并为其注册另一个资源名称。


Example 16.10. U使用自定义资源

  1. <?php
  2.  
  3. /**
  4. * MySQL 资源
  5. *
  6. * 过自定义API,实现用MySQL来存取模板和配置资源。
  7. *
  8. * 表定义:
  9. * <pre>CREATE TABLE IF NOT EXISTS `templates` (
  10. * `name` varchar(100) NOT NULL,
  11. * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  12. * `source` text,
  13. * PRIMARY KEY (`name`)
  14. * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
  15. *
  16. * 演示数据:
  17. * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
  18. *
  19. * @package Resource-examples
  20. * @author Rodney Rehm
  21. */
  22. class Smarty_Resource_Mysql extends Smarty_Resource_Custom {
  23. // PDO 实例
  24. protected $db;
  25. // prepared fetch() statement
  26. protected $fetch;
  27. // prepared fetchTimestamp() statement
  28. protected $mtime;
  29.  
  30. public function __construct() {
  31. try {
  32. $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
  33. } catch (PDOException $e) {
  34. throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
  35. }
  36. $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
  37. $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
  38. }
  39.  
  40. /**
  41. * 从数据库中获取一个模板内容及修改时间。
  42. *
  43. * @param string $name 模板名称
  44. * @param string $source 引用的模板资源
  45. * @param integer $mtime 引用的模板修改时间戳
  46. * @return void
  47. */
  48. protected function fetch($name, &$source, &$mtime)
  49. {
  50. $this->fetch->execute(array('name' => $name));
  51. $row = $this->fetch->fetch();
  52. $this->fetch->closeCursor();
  53. if ($row) {
  54. $source = $row['source'];
  55. $mtime = strtotime($row['modified']);
  56. } else {
  57. $source = null;
  58. $mtime = null;
  59. }
  60. }
  61.  
  62. /**
  63. * 获取一个模板的修改时间
  64. *
  65. * @note 本方法是可选的。仅在修改时间的获取比加载完整的模板资源更快的情况下使用。
  66. * @param string $name 模板名称
  67. * @return integer 模板被修改的时间戳
  68. */
  69. protected function fetchTimestamp($name) {
  70. $this->mtime->execute(array('name' => $name));
  71. $mtime = $this->mtime->fetchColumn();
  72. $this->mtime->closeCursor();
  73. return strtotime($mtime);
  74. }
  75. }
  76.  
  77.  
  78. require_once 'libs/Smarty.class.php';
  79. $smarty = new Smarty();
  80. $smarty->registerResource('mysql', new Smarty_Resource_Mysql());
  81.  
  82. // 在PHP中使用资源
  83. $smarty->display("mysql:index.tpl");
  84. ?>
  85.  

在模板中:

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

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