Get Smarty

Donate

Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Buy cheap glasses from Cheapglasses123.com and save up to 80%.

Where to buy prescription glasses? EyewearCanada.com is your best choice!

Advertisement

资源插件

资源插件被认为是为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. 资源插件


<?php

/**
 * MySQL Resource
 *
 * Resource Implementation based on the Custom API to use
 * MySQL as the storage resource for Smarty's templates and configs.
 *
 * Table definition:
 * <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>
 *
 * Demo data:
 * <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 instance
    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');
    }
    
    /**
     * Fetch a template and its modification time from database
     *
     * @param string $name template name
     * @param string $source template source
     * @param integer $mtime template modification timestamp (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;
        }
    }
    
    /**
     * Fetch a template's modification time from database
     *
     * @note implementing this method is optional. Only implement it if modification times can be accessed faster than loading the comple template source.
     * @param string $name template name
     * @return integer timestamp (epoch) the template was modified
     */
    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'}

     

参见: registerResource(), unregisterResource().

Comments
No comments for this page.

Advertisement