Skip to content

资源 {#resasdources}

模板可能来自各种来源。当你display()fetch()一个模板,或者在另一个模板中包含一个模板时,你需要提供一个资源类型,然后是相应的路径和模板名称。如果没有明确给出资源,将假定$default_resource_type的值。

来自其他来源的模板 {#templates.from.elsewhere}

你可以使用 PHP 可以访问的任何可能的源来检索模板:数据库,套接字,文件等。你可以通过编写资源插件函数并将它们注册到 Smarty 来实现这一点。

请参阅资源插件部分以获取有关你应提供的函数的更多信息。

注意

注意,你不能覆盖内置的file:资源,但是你可以通过在另一个资源名称下注册来提供以某种其他方式从文件系统获取模板的资源。

    <?php

    /**
     * MySQL 资源
     *
     * 基于自定义API的资源实现,使用
     * MySQL作为Smarty模板和配置的存储资源。
     *
     * 表定义:
     * <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;
        // 预处理 fetch() 语句
        protected $fetch;
        // 预处理 fetchTimestamp() 语句
        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 模板修改时间戳 (epoch)
         * @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 模板修改的时间戳 (epoch)
         */
        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");
    ?>

在 Smarty 模板内部:

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

默认模板处理函数 {#default.template.handler.function}

你可以指定一个函数,用于在模板无法从其资源中检索时获取模板内容。这样做的一个用途是创建在运行时不存在的模板。

另请参见Streams