什么是 Smarty?
为何要使用它?
用例和工作流程
语法比较
模板继承
最佳实践
速成课
在一次对display()
或fetch()
的调用中,你可以为单个调用使用多个缓存文件。比如,对display('index.tpl')
的调用可能根据某些条件有若干不同的输出内容,而你希望对每一个输出内容使用单独的缓存。你可以将$cache_id
作为第二个参数传给函数调用来做到这一点。
示例 15.6 向 display() 传递 $cache_id
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); $my_cache_id = $_GET['article_id']; $smarty->display('index.tpl', $my_cache_id); ?>
在上面,我们将变量$my_cache_id
作为$cache_id
传给display()
。对于$my_cache_id
的每个唯一值,将为index.tpl
生成一个单独的缓存。在这个示例中,article_id
在 URL 中传递,并用作$cache_id
。
在将值从客户端(网络浏览器)传递到 Smarty 或任何 PHP 应用程序时,务必非常谨慎。尽管上面从 URL 中使用 article_id 的示例看起来很方便,但它可能有不良后果。$cache_id
用于在文件系统上创建一个目录,因此,如果用户决定为 article_id 传递一个极大的值,或编写一个以极快的速度发送随机 article_id 的脚本,这可能会在服务器级别引发问题。务必在使用传入数据之前对其进行消毒。在此例中,你可能知道 article_id 的长度为十个字符,并且仅由字母数字组成,而且它在数据库中必须是一个有效的 article_id。务必检查这一点!
务必向isCached()
和clearCache()
传递相同的$cache_id
作为第二个参数。
示例 15.7 向 isCached() 传递一个 cache_id
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); $my_cache_id = $_GET['article_id']; if(!$smarty->isCached('index.tpl',$my_cache_id)) { // No cache available, do variable assignments here. $contents = get_database_contents(); $smarty->assign($contents); } $smarty->display('index.tpl',$my_cache_id); ?>
你可以通过向clearCache()
传递NULL
作为第一个参数,清除一个特定$cache_id
的所有缓存。
示例 15.8。清除某个特定 $cache_id 的所有缓存
<?php require('Smarty.class.php'); $smarty = new Smarty; $smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT); // clear all caches with "sports" as the $cache_id $smarty->clearCache(null,'sports'); $smarty->display('index.tpl','sports'); ?>
以这种方式,你可以通过为它们提供相同的 $cache_id
来将缓存 “分组”。