注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

江志祥的博客

可恶的中国银行,信用卡像病毒啊,取消那么难,,,

 
 
 

日志

 
 

smarty3.0中文手册文档API及使用指南_3  

2013-04-28 22:34:30|  分类: 计算机_smarty_ge |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

5、缓存

5.1 开启缓存

smarty默认是不开启缓存的。需要进行设置才能开启缓存。缓存状态的设置需要在display或者fetch模板之前使用。
确定缓存目录是否存在,是否具有足够的权限,设置缓存目录查看3.4。

$smarty->getCaching()    #检查当前是否开启了缓存

$smarty->setCaching(true) #开启缓存

$smarty->isCached($template, $cache_id = null, $compile_id = null)
#检查指定条件的模板文件(名称/缓存id/编译id)是否被缓存(有缓存文件,且在缓存有效时间内)

$smarty->setcache_lifetime(60);   #设置当前的缓存时间

$smarty->getcache_lifetime();     #获得当前的缓存时间,默认是3600(1个小时)

$smarty->display/fetch(模板名,缓存名=null,编译名=null,父模板名=null) 

运行display/fetch就会在缓存目录中产生缓存文件。再次访问时,只要存在该缓存文件,
且在缓存文件的生命周期之内就会直接调用该缓存文件,而不需要重新编译。

$smarty->cache->clearAll($exp_time = null, $type = null)    #清除所有缓存文件,
$exp_time指定一个以秒为单位的最小时间,超过这个时间的缓存都将被清除掉

$smarty->cache->clear($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)   #清除指定条件的缓存文件

可以单设某个条件或者组合多个条件删除多个缓存文件,比如

$smarty->cache->clear($template_name)     #清除名称为template_name的所有缓存文件

$smarty->cache->clear(null, null, $compile_id)    #清除编译id为compile_id的所有缓存文件

$smarty->cache->clear(null, $cache_id = null, $compile_id)    
#清除缓存id为cache_id且编译id为compile_id的所有缓存文件

5.2 局部不缓存

缓存是一种高效访问的理想方式,但是对整个页面进行缓存的时候,
有时候局部的一些元素不希望被缓存,比如时间、实时变化的信息等。

局部缓存有几种方法。

1、nocache属性

$smarty->assign/append($tpl_var, $value = null, $nocache = true …) 
#中规定nocache = true,则模板中该变量各处均不缓存

{$foo nocache=true}   #不管前面如何设置,则该处变量被缓存 

{time() nocache}   #函数也可以,nocache等同于nocache=true

模板中声明的变量和配置文件分配的变量不使用nocache,因为要改变他们的值,
需要编辑模板和配置文件,因为模板文件和配置文件修改就会重新生成缓存文件。

2、insert函数

Insert内部不受缓存影响,但是如果给insert传参,请确保参数不被缓存,详情查看4.4.7

3、{nocache}…..{/nocache}

代码块不缓存。代码块中可以放入变量和自定义模板函数,自定义函数的定义部分代码可以不放入,
但是调用代码必须放入,否则会缓存。insert函数不起作用。

5.3 单页面多缓存

有时候,我们希望单个页面有多个缓存页面。比如index?id=1和index?id=2可能页面内容不同,
希望分别保存在不同的缓存文件中,所以这里我们需要设定cache_id。

例子:Index.php

if(empty($_GET['id']))$_GET['id'] = null;

$smarty->assign('name','韩灵稚1'.$_GET['id']);

$smarty->display('templates/t3.tpl',$_GET['id'],$_GET['id']);

这样为每个由id值创建的网页都生成对应缓存文件,当id无值时(index.php),
直接生成一个缓存文件(名称),当id=1时(index.php?id=1),将生成另一个缓存文件(1^名称)。

5.4 缓存集合

实际上是多个值的不同组合换来的不同页面,比如index.php?id=2&sid=3,没种组合可能产生不同的页面结果。

最开始可以使用连接字符串使id和sid的值连接,理论上将也不会出现重复,
但是会出现这种情况index.php?id=23,是不是和上面的值一样呢。为了避免这种情况,可以使用缓存集合。

if(empty($_GET['id']))$_GET['id'] = null;

if(empty($_GET['sid']))$_GET['sid'] = null;

$smarty->assign('name','韩灵稚1'.$_GET['id']);

$smarty->display('templates/t3.tpl',$_GET['id'].'|'.$_GET['sid']);   #两个变量之间用"|"隔开,
共同组成cache_id.有几个变量最终文件名就有几个"^",如果变量为空,则只有一个"^"

从php的安全考虑,对于传过来的值要进行校验,去掉危险的字符。

5.5 缓存处理函数

smarty允许自己定义缓存读、写和清除的方法,
比如不想用文件的形式进行缓存处理可以写一个有mysql进行缓存读、写和清除的方法。

$smarty->Cache_handler_func=‘自定义函数名称’

在3.0中好像不太好用了。

6、smarty语法高级篇6.1 模板过滤器6.1.1 预过滤器pre

预滤器用来在编译之前直接处理模板源文件。预滤器函数的第一个参数是模板源文件,
该文件可能被其他一些预滤器修正过。此预滤器插件将返回修正过的源文件。
请记住此源文件仅用来编译,它不会在任何地方被保存。

有两种方式:

第一种是临时注册

$smarty->register->preFilter('mypre');     #注册一个预编译器函数 

$smarty->unregister->preFilter ('mypre');     #删除一个预编译器函数 

function mypre($tpl_source, &$smarty)    
#在PHP文件中定义一个预编译器函数,参数格式固定,不可变,返回编译数据

{

return "mypre<br />".$tpl_source;

}

第二种是载入组件

在smarty程序目录中有libs/plugins目录,在这里我们可以创建自己的过滤器组件。

创建php文件,prefilter.函数名.php(本例中是prefilter.mypre.php)  #也可以用其他组件的php文件

function smarty_prefilter_mypre($source, $smarty)  
 #在smarty组件文件中定义一个预编译器函数组件,函数名称和参数严格不变

{

    return "mypre_plus<br />".$source;

}

$smarty->autoload_filters = array('pre'=>array('mypre'));  #在php文件中调用组件过滤器

$smarty->autoload_filters = array()  #取消调入的组件过滤器 

过滤器可以载入多个,

$smarty->register->preFilter('mypre');   #第一种方法,就是罗列一下,在上面先执行谁

$smarty->register->preFilter('mypre1');

$smarty->autoload_filters = array('pre'=>array('mypre','mypre1'));   #第二种方法,就是建立数组就行,在前面的先执行。

6.1.2 后过滤器post

后滤器用来在编译之后直接处理模板的编译输出(PHP代码),
但须在编译之后的模板被保存到文件系统之前就进行操作。
预滤器函数的第一个参数是编译之后的模板代码,该代码可能被其他一些后滤器修正过。
此后滤器插件将返回修正过的代码文件。

有两种方式:

第一种是临时注册

$smarty->register->postFilter('mypre');     #注册一个后编译器函数 

$smarty->unregister->postFilter ('mypre');     #删除一个后编译器函数 

function mypost($tpl_source, &$smarty)    #在php文件中定义一个后编译器函数,
参数格式固定,不可变,返回编译数据

{

return "mypost<br />".$tpl_source;

}

第二种是载入组件

在smarty程序目录中有libs/plugins目录,在这里我们可以创建自己的过滤器组件。

创建php文件,postfilter.函数名.php(本例中是postfilter.mypost.php)  #也可以用其他组件的php文件

function smarty_postfilter_mypost($source, $smarty)   
#在smarty组件文件中定义一个预编译器函数组件,函数名称和参数严格不变

{

    return "mypost_plus<br />".$source;

}

$smarty->autoload_filters = array('post'=>array('mypost'));  #在php文件中调用组件过滤器

$smarty->autoload_filters = array('post'=>array())  #取消调入的组件过滤器 

过滤器可以载入多个,

$smarty->register->postFilter('mypost');   #第一种方法,就是罗列一下,在上面先执行谁

$smarty->register->postFilter('mypost1');

$smarty->autoload_filters = array('post'=>array('mypost','mypost1'));   
#第二种方法,就是建立数组就行,在前面的先执行。

6.1.3 输出过滤器output

输出过滤器插件的作用是,在装载并执行完一个模板之后显示模板之前,操作该模板的输出。

pre和post都会将过滤器加工后的结果硬编码写入编译文件,
也就意味着pre和post始终会被缓存(即使php不缓存)。
output不会,将不会写入编译文件以及之后的缓存文件,所以他是不被缓存的。

pre和post对于模板中调用的模板,比如include file,均需执行一遍。
而output只对编译后的文件执行一次(也就是总共执行一次)

有两种方式:

第一种是临时注册

$smarty->register->outputFilter('myoutput');     #注册一个后编译器函数 

$smarty->unregister->outputFilter ('mypre');     #删除一个后编译器函数 

function myoutput($tpl_source, &$smarty)    
#在php文件中定义一个后编译器函数,参数格式固定,不可变,返回编译数据

{

return "myoutput<br />".$tpl_source;

}

第二种是载入组件

在smarty程序目录中有libs/plugins目录,在这里我们可以创建自己的过滤器组件。

创建php文件,outputfilter.函数名.php(本例中是outputfilter.myoutput.php)  #也可以用其他组件的php文件

function smarty_outputfilter_myoutput($source, $smarty)   
#在smarty组件文件中定义一个预编译器函数组件,函数名称和参数严格不变

{

    return "myoutput_plus<br />".$source;

}

$smarty->autoload_filters = array('output'=>array('myoutput'));  #在php文件中调用组件过滤器

$smarty->autoload_filters['output'] = array()  #取消调入的组件过滤器 

过滤器可以载入多个,

$smarty->register->outputFilter('myoutput');   #第一种方法,就是罗列一下,在上面先执行谁

$smarty->register->outputFilter('myoutput1');

$smarty->autoload_filters = array('output'=>array('myoutput','myoutput1'));   
#第二种方法,就是建立数组就行,在前面的先执行。

6.2 错误和异常6.2.1 触发错误 trigger_error

php中也有trigger_error函数

Void trigger_error(string error_msg, [int level])   #int level就是错误级别,也可以用常量代替,E_USER_NOTICE, E_USER_WARNING等。set_error_handler()函数进行捕获处理。

$smarty->trigger_error($error_msg, $error_type = E_USER_WARNING)   
 #格式与PHP中的同名函数一样,只能抛出$smarty的异常

6.2.2 错误处理函数

$smarty->setExceptionHandler(handlerfuncname)   
# 设置异常处理的函数,只可以处理有smarty引发的错误,
不能解决trigger_error。set_error_handler()函数只能解决php的,而不能解决smarty抛出的错误。

function handlerfuncname($errstr)

{

echo $errstr;

}

6.3 数据对象

3.0推出一个新的数据对象。可以从$smarty中创建一个或者多个数据对象,集中赋值,
然后有选择性选取某个或者多个数据对象,生成模板。

$smarty->createData($parent = null)  #创建数据对象,可以选择父对象,子对象将继承父对象的赋值。

例子:

$mydata = $smarty->createData();  #创建一个数据对象,没有父对象

$mydata1 = $smarty->createData($mydata);   #创建一个数据对象,父对象是$mydata

$mydata->assignByRef('assign_obj',&$han);

$mydata->assign('name','abcd');

$mydata1-> assign('name','bcds');     #mydata1自动继承了mydata的数据,如果相同,则新值覆盖旧值

$smarty->display('templates/t4.tpl',null,null,$mydata1);     
#显示模板,最后一个参数必须有,指定模板使用哪个数据对象。也可以使用模板对象调用,参看6.4

6.4 模板对象

3.0同时推出一个新的模板对象。可以从$smarty中创建一个或者多个模板对象,
模板对象可以自己分配变量,同时可以调用数据对象(父对象)来生成文件。

$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)   
#创建模板对象,可以选择父对象,编译id和缓存id。

例子:

$mytemplate = $smarty->createTemplate('templates/t4.tpl');  #创建一个模板对象,没有父对象,默认为$smarty

$mytemplate1 = $smarty->createTemplate('templates/t4.tpl',null,null,$mydata);  #创建一个模板对象,父对象为mydata,mydata中的数据自动加载进来。

$mytemplate->assignByRef('assign_obj',&$han);    #定义变量

$mytemplate->assign('name','abcd');

$mytemplate->display();            #生成文件。

如果一个模板是通过include方式调用的,则子模板的父对象将指向引用它的模板对象。

所有当前模板变量和父对象的模板对象都是可以获取的,但是如果是通过{assign}或者{$foo=…}
这样的方法创建或者修改变量则它的作用域将只停留在当前模板对象。

6.5 模板继承

模板继承,可以在模板中写{block} … {/block}快,并且这些块可以在子模板中进行覆盖。例子:

Parent.tpl

-----------------------------------------------------

<html>

<body>

{block name='top'} Parent.tpl的头部<br />{/block}<hr />

{block name='middle'} Parent.tpl的中部<br />{/block}<hr />

{block name='buttom'} Parent.tpl的尾部<br />{/block}

</body>

</html>

child.tpl

{extends file='parent.tpl'}    #继承父模板

{block name='top'}{$smarty.block.parent}{"`$smarty.template`的头部"} {/block}    
#child模板更新了top块。其他按照默认继承。

可以通过extends标签来指定被继承的模板,并在子模板中通过重写父模板的同名block块,达到覆盖的目的。
同时,可以通过{$smarty.block.parent}获取到父block的内容。
在子模板中,所有在{block} … {/block}之外的内容都将被忽略,这种继承支持多文件,多重继承,
意味着可以无限的继承下去。还可通过{block}的append和prepend属性来插入父模板结构中

6.6 资源相关内容(未写)

 

6.7 动态注册组件

注册可以理解为是动态的注册组件,与写死到文件中的组件类似,参考6.8

6.7.1 注册对象

SMARTY允许通过模板访问PHP对象。有两种方式来访问它们。

一种是注册对象到模板,然后通过类似于用户自定义函数的形式来访问它。

$smarty->register->templateObject($object_name, $object_impl, $allowed = array(), 
$smarty_args = true, $block_methods = array())
  #向模板注册一个对象,allowed是允许接受的方法。

$smarty->register->templateObject('reg_obj',$han,array('show','show1'));

{reg_obj->show var=2 var1=3}   #在模板中访问,注意!接受的参数是数组,跟insert类似

$smarty->unregister->templateObject($object_name)    #注销对象

第一种方法有一个很好的模板语法,同时它作为一个注册对象被限制为几个固定的方法和目标,
这样是比较安全的,但是他只能够调用对象方法,而且不支持数据对象和模板对象。

另一种方法给模板分配对象,然后通过访问其它赋值变量类似的方法进行访问。

$mysmarty->assignByRef('assign_obj',&$han);     #建议使用引用分配,对象一般都很大,节省内存

{$assign_obj->方法或者属性}     #在模板中访问

这种方法可以调用对象的属性。而且可以用数据对象和模板对象注册

6.7.2 注册块

$smarty->register->block($block_tag, $block_impl, $cacheable = true, $cache_attr = array())

用来动态注册/定义块函数插件。前两个参数指定块函数名称和执行函数的名称。
执行函数的名称格式可以是一个包含函数名称的字符串;
也可以是一个array(&$object, $method)数组形式,其中&$object是一个对象的引用,而$method是它的一个方法;
还可以是一个array(&$ class, $method)数组形式,其中$class是一个类的名称,$method是类

中的一个方法。

$cacheable,如果启用页面缓存,块级函数是否缓存,默认是true。

$cacheattr,如果$cacheale为false,也就是块级函数不缓存,可以设置块级函数中的部分属性缓存,已数组定义。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->block('hhh', array(&$hanobj,'myf'),false,array('fn'));   #动态注册块

class han{

。。。。。。

public function myf($params,$content,&$smarty,&$repeat){   #定义块引用的函数

return "这是".$params['fn'].$params['un']."注释说明!<br />\r\n".$content;

}

}

{hhh fn=$name un=$name1}     #在模板中调用,块级内容没有被缓存,属性fn被缓存

aaaaaaa

{time()}

{/hhh}

 

$smarty->unregister->block($block_tag)   #注销块

6.7.3 注册函数

$smarty->register->compilerFunction($compiler_tag, $compiler_impl, $cacheable = true)  
 #注册编译函数,编译函数不能指定缓存属性

$smarty->register->templateFunction($function_tag, $function_impl, $cacheable = true, $cache_attr = array())    
 #注册模板函数,3.0后可以直接在模板中定义函数了,不需要注册

动态注册模板函数插件,前两个参数是模板函数名称和执行函数名称。
执行函数的格式可以是一个包含函数名称的字符串;也可以是一个array(&$object, $method)数组形式,
其中&$object是一个对象的引用,而$method是它的一个方法;
还可以是一个array(&$ class, $method)数组形式,
其中$class是一个类的名称,$method是类中的一个方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->templateFunction('hhh', array(&$hanobj,'myf'),false,array('fn'));

class han{

     …………….

public function myf($params,&$smarty,&$repeat){   #注册的函数只有3个参数

return time()."这是".$params['fn'].$params['un']."注释说明!<br />\r\n";

}

}

{hhh fn=$name un=$name1}   #在模板中调用,函数没有被缓存,属性fn被缓存

$smarty->unregister->compilerFunction($compiler_tag)   #注销注册函数

$smarty->unregister->templateFunction($function_tag)

6.7.4 注册变量调节器

$smarty->register->modifier($modifier_name, $modifier_impl)

动态注册调节器函数插件,前两个参数是模板调节器名称和执行函数名称。
执行函数的格式可以是一个包含函数名称的字符串;
也可以是一个array(&$object, $method)数组形式,其中&$object是一个对象的引用,
而$method是它的一个方法;还可以是一个array(&$ class, $method)数组形式,
其中$class是一个类的名称,$method是类中的一个方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->modifier('hhh',array(&$hanobj,'myf'));  #注册调节器

class han{

。。。。。。

public function myf($string) {

return time().$string;

}

}

 

{$name|hhh nocache=true}  # 在模板中调用,nocache为true,表示该变量不缓存

$smarty->unregister->modifier($modifier)    #注销变量调节器

6.8 组件相关内容6.8.1 建立过滤器组件

请参考6.1.1 预过滤器pre

请参考6.1.2 后过滤器 post

请参考6.13 输出过滤器 output

6.8.2 建立块组件

在libs/plugins中创建块组件文件block.块名.php

function smarty_block_hhhh($params,$content,&$smarty,&$repeat)   #函数名称格式要固定

{

return "这是".$params['fn'].$params['un']."注释说明!<br />\r\n".$content;

}

 

{hhhh fn=$name un=$name1}     #在模板中调用

 aaaaaaa

{time()}

{/hhhh}

与动态注册相比,不能规定块缓存

6.8.3 建立函数组件

在libs/plugins中创建函数组件文件function.函数名.php

function smarty_function_hhhh($params,&$smarty,&$repeat){    #在组建文件中建立函数

return time()."这是".$params['fn'].$params['un']."注释说明!<br />\r\n";

}

{nocache}

{hhhh fn=$name un=$name1}     #在模板中调用,如果想不缓存,可以用{nocache}括住

{/nocache}

6.8.4 建立变量调节器组件

在libs/plugins中创建调节器组件文件modifier.调节器名.php

function smarty_modifier_hhhh($string)       #在组建文件中建立调节器函数

{

return time().$string;

}

 

{$name|hhhh nocache=true}   #在模板中调用

6.8.5 建立insert函数组件

在libs/plugins中创建调节器组件文件insert.函数名.php

function smarty_insert_hhhh($params,&$smarty){  #在组件文件中建立insert函数

return time()."这是".$params['fn']."|".$params['un']."注释说明!<br />\r\n";

}

 

{insert name="hhhh" fn=$name un=$name1}   #在模板中调用函数内部不缓存,但是传递的参数会缓存。

  评论这张
 
阅读(112)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017