自定义标签在一般情况下建议不要乱用,毕竟后面维护起来要找到很深的位置才能发现代码的真正位置,别人看不懂你写的标签是非常困惑的一件事。除非这行属于你自己的代码出现了多次,比如UEditor富文本编辑器等,同时所有参与开发都明白这个自定义标签的意义,然而,即使你不用,也要明白ThinkPHP的自定义标签机制,不然遇到看不懂就呵呵了。
ThinkPHP中所谓的自定义标签原理与《【Jsp】JSP自定义标签与MODEL1、MODEL2标准》(点击打开链接)同样,都是写一大段php代码,接受标签内的参数,进行处理。
如下图:
根据Lib\Action\TagDefineAction.class.php:
<?php
class TagDefineAction extends Action{
public function index(){
$this->display();
}
}
?>
所跳转的Tpl\TagDefine\index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<output text="Helloworld" /><br/>
<output_no_close text="Helloworld">呵呵</output_no_close>
</body>
</html>
就根据output这个闭合标签与output_no_close这个不闭合的标签的,输出了如下的参数。所谓的“闭合标签”与“不闭合标签”就是这个标签中间能不能夹东西,也就是HTML里面的双节点标签与单节点标签。
显然,ThinkPHP根本没有output与output_no_close如此脑残的标签。
其真正输出语句在Lib\TagLib的php文件中,皆是TagLibXX.class.php的形式,其中XX为你定义的标签名,这里是output与output_no_close,必须遵循这样的规则。
具体制作过程如下:
1、首先在(ThinkPHP的根目录)\Conf\config.php中定义你要设置的自定义标签:
<?php
return array(
'URL_MODEL'=>2,//设置url重写
'URL_HTML_SUFFIX'=>'html',//设置URL后缀,用于搜索引擎的收录
'URL_CASE_INSENSITIVE'=>true,//实现URL访问不再区分大小写了
//数据库设置
'DB_TYPE'=>'mysql',//数据库类型
'DB_HOST'=>'localhost',//服务器地址
'DB_NAME'=>'test',//数据库名
'DB_USER'=>'root',//用户名
'DB_PWD'=>'root',//密码
'DB_PORT'=>3306,//端口
'DB_PREFIX'=>'',//数据库表前缀,这里没有,留空
//开启自定义标签
'TAGLIB_LOAD'=>true,
'APP_AUTOLOAD_PATH'=>'@.TagLib',
'TAGLIB_BUILD_IN'=>'Cx,Output,Output_no_close',
);
?>
真正有用的是这里的后三行内容,上面的内容,与此专题无关,有兴趣可以看《【ThinkPHP】ThinkPHP对Mysql数据库的增删改查,volist标签附带条件判断的用法》( 点击打开链接)与《【ThinkPHP】关于URL的设置、伪静态》( 点击打开链接),反正这个(ThinkPHP的根目录)\Conf\config.php是整个工程的根,相当于Java中的xml。
如上图,这就定义了两个自定义标签,一个output,一个output_no_close。
此时,必须在Lib\TagLib下,Lib下没有TagLib目录的话请自己新建,必须有TagLibOutput.class.php与TagLibOutput_no_close.class.php与其相对应,否则工程运行就报错。
对于闭包的标签TagLibOutput.class.php,里面的内容如下:
<?php
class TagLibOutput extends TagLib{
protected $tags=array("output"=>array("attr"=>"text","close"=>0));
//这里,"output"就是自定义标签名,与其他部分形成对应关系,该是什么写什么。
//"attr"=>"text"代表接受text这个参数
//"close"=>0代表这个标签为闭包标签
public function _output($attr,$content){//这里的函数名也是指定动作,_output中"output"就是自定义标签名
$attr=$this->parseXmlAttr($attr);//解释传过来的参数,指定动作。
$text=$attr["text"];//赋予给text这个变量
$str=//然后在这个要返回的字符串中,尽情构造,你要实现的功能。当然,在一个$str变量中写php代码与写ajax一样有点恶心,提供一个用.连接的写作方法。如下所示。
"<?php ".//唯一值得注意的是,这里的<?php后面注意留一个空格!
"echo '输出:".$text."';".
"?>";
return $str;
}
}
?>
这个文件,返回的php代码将传递过来的$text变量输出出来。整个_output函数没有使用到$content变量,是因为这个变量就是非闭包标签中间夹着的内容啊!闭包标签没有这项,因此$content对于闭包标签是没有意义,故对于非闭合的output_no_close标签的TagLibOutput_no_close.class.php的代码如下:
<?php
class TagLibOutput_no_close extends TagLib{
protected $tags=array("output_no_close"=>array("attr"=>"text","close"=>1));
//这里,"output_no_close"就是自定义标签名,与其他部分形成对应关系,该是什么写什么。
//"attr"=>"text"代表接受text这个参数
//"close"=>1代表这个标签为非闭包标签
public function _output_no_close($attr,$content){
$attr=$this->parseXmlAttr($attr);
$text=$attr["text"];
$str=
"<?php ".
"echo '参数text的值为:".$text.",标签中间的内容为:".$content."';".//输出传递过来的$text变量的同时输出标签中间夹着的内容
"?>";
return $str;
}
}
?>
闭合标签的TagLibXX.class.php与非闭合标签的TagLibXX.class.php结构基本一样,就是改几个参数而已。