【ThinkPHP】自定义标签
自定义标签在一般情况下建议不要乱用,毕竟后面维护起来要找到很深的位置才能发现代码的真正位置,别人看不懂你写的标签是非常困惑的一件事。除非这行属于你自己的代码出现了多次,比如UEditor富文本编辑器等,同时所有参与开发都明白这个自定义标签的意义,然而,即使你不用,也要明白ThinkPHP的自定义标签机制,不然遇到看不懂就呵呵了。
ThinkPHP中所谓的自定义标签原理与《【Jsp】JSP自定义标签与MODEL1、MODEL2标准》(点击打开链接)同样,都是写一大段php代码,接受标签内的参数,进行处理。
如下图:
根据LibActionTagDefineAction.class.php:
<?php class TagDefineAction extends Action{ public function index(){ $this->display(); } } ?>
所跳转的TplTagDefineindex.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如此脑残的标签。
其真正输出语句在LibTagLib的php文件中,皆是TagLibXX.class.php的形式,其中XX为你定义的标签名,这里是output与output_no_close,必须遵循这样的规则。
具体制作过程如下:
1、首先在(ThinkPHP的根目录)Confconfig.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的根目录)Confconfig.php是整个工程的根,相当于Java中的xml。
如上图,这就定义了两个自定义标签,一个output,一个output_no_close。
此时,必须在LibTagLib下,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结构基本一样,就是改几个参数而已。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。