天天看点

【ThinkPHP】自定义标签

自定义标签在一般情况下建议不要乱用,毕竟后面维护起来要找到很深的位置才能发现代码的真正位置,别人看不懂你写的标签是非常困惑的一件事。除非这行属于你自己的代码出现了多次,比如UEditor富文本编辑器等,同时所有参与开发都明白这个自定义标签的意义,然而,即使你不用,也要明白ThinkPHP的自定义标签机制,不然遇到看不懂就呵呵了。

ThinkPHP中所谓的自定义标签原理与《【Jsp】JSP自定义标签与MODEL1、MODEL2标准》(点击打开链接)同样,都是写一大段php代码,接受标签内的参数,进行处理。

如下图:

【ThinkPHP】自定义标签

根据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】自定义标签

显然,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。

【ThinkPHP】自定义标签

如上图,这就定义了两个自定义标签,一个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结构基本一样,就是改几个参数而已。