自定义标签在一般情况下建议不要乱用,毕竟后面维护起来要找到很深的位置才能发现代码的真正位置,别人看不懂你写的标签是非常困惑的一件事。除非这行属于你自己的代码出现了多次,比如UEditor富文本编辑器等,同时所有参与开发都明白这个自定义标签的意义,然而,即使你不用,也要明白ThinkPHP的自定义标签机制,不然遇到看不懂就呵呵了。
ThinkPHP中所谓的自定义标签原理与《【Jsp】JSP自定义标签与MODEL1、MODEL2标准》(点击打开链接)同样,都是写一大段php代码,接受标签内的参数,进行处理。
如下图:
根据Lib\Action\TagDefineAction.class.php:
<?php class TagDefineAction extends Action{ public function index(){ $this->display(); } } ?>
<!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>
显然,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', ); ?>
如上图,这就定义了两个自定义标签,一个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 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; } } ?>