Smarty 是什么?
为什么要使用它?
用例和工作流
语法对比
模板继承
最佳实践
速成课程
您可以在单个调用 display()
或 fetch()
的情况下,使用多个缓存文件。假设调用 display('index.tpl')
可能根据某些条件而有多种不同的输出内容,并且您希望为每种输出内容使用单独的缓存。您可以通过将 $cache_id
作为第二个参数传递到函数调用中来实现这一点。
示例 15.6. 将 $cache_id 传递到 display() 中
<?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,为此请进行检查!
务必将相同的 $cache_id
作为第二个参数传递到 isCached()
和 clearCache()
中。
示例 15.7. 将 cache_id 传递到 isCached() 中
<?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); ?>
您可以通过将 NULL
作为 clearCache()
的第一个参数来清除特定 $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
来将您的缓存分组在一起。