Smarty 图标

你可以根据商标通知使用 Smarty 标识。

Smarty Template Engine Smarty Template Engine

关于赞助、广告、新闻或其他问题,可以通过以下方式与我们联系

使用 Smarty 的网站

广告

缓存输出的可控性

如果通常启用缓存,则页面的整个最终输出都会被缓存起来。但是 Smarty3 提供了几个选项来将输出部分排除在缓存之外。

一般说明

确保当页面从缓存中载入时,在非缓存部分中使用的所有变量也从 PHP 分配。

模板部分的可缓存性

使用{nocache}{/nocache}标签可以轻松地将较大的模板部分排除在缓存之外。

示例 15.10 阻止模板部分被缓存


Today's date is
{nocache}
{$smarty.now|date_format}
{/nocache}

   

以上代码会在缓存页面上输出当前日期。


标签的可缓存性

通过将 "nocache" 选项标志添加到标签,可以禁用单个标签的缓存。

示例 15.11 阻止标签输出被缓存

Today's date is
{$smarty.now|date_format nocache}

    

变量的可缓存性

你可以将变量assign()指定为不可缓存。任何使用此变量的标签都将在无缓存模式下自动执行。

备注

如果标签在无缓存模式下执行,则必须确保该标签使用的所有其他变量也从 PHP 分配(当页面从缓存中载入时)。

备注

已分配变量的无缓存状态会影响编译后的模板代码。如果更改状态,则必须手动删除现有的已编译缓存模板文件以强制重新编译。

示例 15.12 无缓存变量

// assign $foo as nocahe variable
$smarty->assign('foo',time(),true);


Dynamic time value is {$foo}

    

插件的可缓存性

在注册插件时可以声明其可缓存性。registerPlugin()的第三个参数称为$cacheable,其默认值为TRUE

使用 $cacheable=false 注册插件时,每次显示页面都会调用该插件,即使页面来自缓存。该插件函数的行为有点像 {insert} 函数。

备注

$cacheable 状态将影响已编译的模板代码。如果更改状态,则必须手动删除现有的已编译缓存的模板文件以强制重新编译。

{insert} 相反,默认情况下,插件的属性不会缓存。可以使用第四个参数 $cache_attrs 声明将它们缓存起来。$cache_attrs 是应该缓存的属性名称数组,因此,每次从缓存中获取时,插件函数都会获取页面写入缓存时的时间值。

示例 15.13. 防止插件输出被缓存

<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function remaining_seconds($params, $smarty) {
    $remain = $params['endtime'] - time();
    if($remain >= 0){
        return $remain . ' second(s)';
    }else{
        return 'done';
    }
}

$smarty->registerPlugin('function','remaining', 'remaining_seconds', false, array('endtime'));

if (!$smarty->isCached('index.tpl')) {
    // fetch $obj from db and assign...
    $smarty->assignByRef('obj', $obj);
}

$smarty->display('index.tpl');
?>

   

其中 index.tpl

Time Remaining: {remaining endtime=$obj->endtime}

   

每次显示页面时,剩余时间 $obj 结束的时间秒数都会更改,即使页面已缓存。由于 endtime 属性已缓存,因此只有在页面写入缓存时才需要从数据库中提取对象,但在后续页面请求中则不需要。


示例 15.14. 防止模板的整个段落被缓存

index.php:

<?php
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

function smarty_block_dynamic($param, $content, $smarty) {
    return $content;
}
$smarty->registerPlugin('block','dynamic', 'smarty_block_dynamic', false);

$smarty->display('index.tpl');
?>

   

其中 index.tpl

Page created: {'0'|date_format:'%D %H:%M:%S'}

{dynamic}

Now is: {'0'|date_format:'%D %H:%M:%S'}

... do other stuff ...

{/dynamic}

   

重新加载页面时,您会注意到两个日期不同。一个是 动态,另一个是 静态。您可以在 {dynamic}...{/dynamic} 之间执行任何操作,并确保不会像页面其余部分一样被缓存。

备注

上述示例仅演示动态块插件的工作原理。有关如何使用内置 {nocache}{/nocache} 标记禁用模板段落缓存的信息,请参见 Cacheability of Template Section