在模版中使用的Samrty自定义标签有“函数”和“块”两种形式。编写的方式相似,和添加修改器插件的操作步骤完全相同:
一种是将PHP脚本中编写的函数注册到Samrty对象中称为Samrty标签;另一种是以特定的文件的方式扩充Samrty函数插件
1. 为Samrty模版扩充函数插件
1.1 registerPlugin()方法动态扩充插件
使用registerPlugin()
方法动态注册一个函数插件。其第一个参数修改为“function”,其他参数和注册修改器方式相同。
在声明PHP函数时,需要两个参数:在模版中传递给模版函数的所有属性都包含在关联数组中作为第一个参数;第二个参数使用来接收自动传入的Smarty对象,可以通过这个参数在函数中调用Smarty对象中的成员。在模版中,函数的输出内容(返回值)在原位置用函数标签代替。
<?php
include '../Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';
//自定义一个函数
//tpl调用形式<{circular times="4" size="5" con="hello, 常智" color="red"}>
function test1($args){
$str="";
for ($i=0; $i < $args['times']; $i++) {
$str.="<br/><font color='".$args['color']."'size='".$args['size']."'>".$args['con']."</font>";
}
return $str;
}
$smarty->registerPlugin("function","circular","test1");
$smarty->display('testSmarty1.html');
1.2 以特定文件方式扩充函数插件
推荐此方式。在plugins目录下声明函数插件的命名规则是“function.函数名.php”的结构。在这个文件中的函数命令规则是”smarty_function_函数名($params,$smarty)
“,在这个函数中需要声明两个参数,第一个参数接收所有属性,第二个参数为smarty对象。
将上述的动态插件转换为该形式表示:function.circular.php
<?php
/**
* Description: function.circular.php smarty插件
* Version: 1.1
* Author: Chang <chriszchang@163.com>
* Date: 2016/04/02
* Time: 15:51
*/
//调用形式<{circular times=2 size="4" con="hello,chris" color="orange"}>
function smarty_function_circular($params, $smarty)
{
$str = "";
for ($i = 0; $i < $params['times']; $i++) {
$str .= "<br/><font color='" . $params['color'] . "'size='" . $params['size'] . "'>" . $params['con'] . "</font>";
}
return $str;
}
2. 为Smarty模版插件扩充块函数插件
2.1 registerPlugin()方法动态扩充块函数插件
添加方式和上述函数插件类似,不过使用addPlugin()
动态注册时,第一个参数为接收的所有属性,第二个参数为{func}...{/func}
之间的内容。
<?php
//自定义一个块函数
//tpl调用形式<{chang times="4" size="5" color="red"}>hello, chang<{/chang}>
function test2($args,$con){
$str="";
for ($i=0; $i < $args['times']; $i++) {
$str.="<br/><font color='".$args['color']."'size='".$args['size']."'>".$con."</font>";
}
return $str;
}
$smarty->registerPlugin("block","chang","test2");
$smarty->display('testSmarty1.html');
2.2 以特定文件方式扩充函数插件
文件命名规则是”block.块函数名.php”,块函数命名规则为”smarty_block_块函数名($params,$content,$smarty,&$repeat)
“.
参数说明:
- 只有块函数的开始标签具有属性,所有属性包含在作为关联数组的$params变量中。当处理闭合标签时,函数同样可访问开始标签的属性。
$content
变量值取决于你的函数时被开始标签调用还是被闭合标签调用。如果是开始标签,则变量值为NULL,如果是闭合标签,则$content
值即为模板块的内容.不过要注意,此时模板块已经被smarty处理过,因此$content值为模版的输出,而非模版资源&$repeat
参数通过引用传递给函数执行,并为其提供控制块显示多少次的可能性。默认情况下,在首次调用块函数(块开始标签)时&$repeat
值为true,在随后的所有块函数(闭合标签)调用中其值始终为false.函数每次执行返回的&$repeat
值为true时,{func}...{/func}
之间的内容会被求值,同时参数$content
里的新块内容会再次调用执行函数(运行方法类似递归函数)。如果嵌套了块函数,可以通过$smarty->_tag_stack
变量访问找出父块函数。
例如:
<?php
/**
* Description:function.circular.php
* Version: 1.1
* Author: Chang <chriszchang@163.com>
* Date: date
* Time: time
*/
//模版调用形式:<{circular times=4 size="4" color="orange"}>hello,world<{/circular}>
function smarty_block_circular($params,$content,$smarty,&$repeat){
//仅输出关闭标签
if(!$repeat){
if(isset($content)){
$str="";
for ($i=0; $i < $params['times']; $i++) {
$str.="<br/><font color='".$params['color']."'size='".$params['size']."'>".$content."</font>";
}
return $str;
}
}
}