自定义模板资源
你可以通过任何可访问的来源来提供模板,如数据库,网络sockets,文件等,编写这些来源的资源插件并将他们注册到Smarty。
参见资源插件。
Note
注意你不能覆盖内置的file:
资源, 但你可以设计一个基于文件系统的资源并为其注册另一个资源名称。
- <?php
- /**
- * MySQL 资源
- *
- * 过自定义API,实现用MySQL来存取模板和配置资源。
- *
- * 表定义:
- * <pre>CREATE TABLE IF NOT EXISTS `templates` (
- * `name` varchar(100) NOT NULL,
- * `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- * `source` text,
- * PRIMARY KEY (`name`)
- * ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
- *
- * 演示数据:
- * <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');</pre>
- *
- * @package Resource-examples
- * @author Rodney Rehm
- */
- class Smarty_Resource_Mysql extends Smarty_Resource_Custom {
- // PDO 实例
- protected $db;
- // prepared fetch() statement
- protected $fetch;
- // prepared fetchTimestamp() statement
- protected $mtime;
- public function __construct() {
- try {
- $this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty", "smarty");
- } catch (PDOException $e) {
- throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
- }
- $this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
- $this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
- }
- /**
- * 从数据库中获取一个模板内容及修改时间。
- *
- * @param string $name 模板名称
- * @param string $source 引用的模板资源
- * @param integer $mtime 引用的模板修改时间戳
- * @return void
- */
- protected function fetch($name, &$source, &$mtime)
- {
- $this->fetch->execute(array('name' => $name));
- $row = $this->fetch->fetch();
- $this->fetch->closeCursor();
- if ($row) {
- $source = $row['source'];
- $mtime = strtotime($row['modified']);
- } else {
- $source = null;
- $mtime = null;
- }
- }
- /**
- * 获取一个模板的修改时间
- *
- * @note 本方法是可选的。仅在修改时间的获取比加载完整的模板资源更快的情况下使用。
- * @param string $name 模板名称
- * @return integer 模板被修改的时间戳
- */
- protected function fetchTimestamp($name) {
- $this->mtime->execute(array('name' => $name));
- $mtime = $this->mtime->fetchColumn();
- $this->mtime->closeCursor();
- return strtotime($mtime);
- }
- }
- require_once 'libs/Smarty.class.php';
- $smarty = new Smarty();
- $smarty->registerResource('mysql', new Smarty_Resource_Mysql());
- // 在PHP中使用资源
- $smarty->display("mysql:index.tpl");
- ?>
在模板中:
- {include file='mysql:extras/navigation.tpl'}