thinkPHP2.1自定义标签库的导入方法详解

2018-09-21 10:10

阅读:372

  本文详细讲述了thinkPHP2.1自定义标签库的导入方法。分享给大家供大家参考,具体如下:

  TP的手册似乎跟不上节奏, 对自定义标签只是寥寥几句, 摸索了N久, 终于将自定义的标签进行了导入. 心得如下:

  1. 情况: 新建自定义的标签库类: @.Mylib.Tag.TagLibTest — 懂TP的应该知道这代表的路径

  使用Examples下的Tag演示文件

   <?php // +----------------------------------------------------------- // ThinkPHP // +------------------------------------------------------------ // Copyright (c) 2009 标签定义 protected $tags = array( // 标签定义: //attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次 article=>array(attr=>name,field,limit,order,where,sql,key,mod,level=>3), ); //定义查询数据库标签 public function _article($attr,$content) { $tag = $this->parseXmlAttr($attr,article); $result = !empty($tag[result])?$tag[result]:article; //定义数据查询的结果存放变量 $key = !empty($tag[key])?$tag[key]:i; $mod = isset($tag[mod])?$tag[mod]:2; if ($tag[name]) { //根据用户输入的值拼接查询条件 $sql = M({$tag[name]})->; $sql .= ($tag[field])?field({$tag[field]})->:; $sql .= ($tag[order])?order({$tag[order]})->:; $sql .= ($tag[where])?where({$tag[where]})->:; $sql .= select(); }else{ if (!$tag[sql]) return ; //排除没有指定model名称,也没有指定sql语句的情况 $sql .= M()->query({$tag[sql]}); } //下面拼接输出语句 $parsestr = <?php $_result=.$sql.; if ($_result): $.$key.=0;; $parsestr .= foreach($_result as $key=>$.$result.):; $parsestr .= ++$.$key.;$mod = ($.$key. % .$mod. );?>; $parsestr .= $content;//解析在article标签中的内容 $parsestr .= <?php endforeach; endif;?>; return $parsestr; } } ?></liu21st>

  然后在项目下的Conf目录新建taglibs.php文件, 内容:

   <?php return array( article=>@.TagLib.TagLibarticle, ); ?>

  这样就可以模板里使用了:

   <tagLib name=article /> <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN> <html> <head> <meta http-equiv=Content-Type content=text/html; charset=utf-8> <title>ThinkPHP示例:自定义标签</title> <link rel=stylesheet type=text/css href=__PUBLIC__/Css/common.css> </head> <body> <div class=main> <h2>ThinkPHP示例之自定义标签:定义查询数据库的标签</h2> 本示例定义一个查询数据库的标签,可以使模板直接按条件查找指定的数据库并列表显示,本例仅是展示自定义标签的方便之处,可以进一步扩充和完善,打造属于自已的标签体系 <table cellpadding=2 cellspacing=2> <thead> <tr> <td class=tLeft width=8%>序列</td><td class=tLeft width=12%>标题</td><td>内容tent}</td> </tr> </article:article> <tr> <td colspan=3> <hr> 示例源码<br/>控制器自定义标签类<br/> <php>highlight_file(LIB_PATH.TagLib/TagLibarticle.class.php);</php></td> </tr> </table> </div> </body> </html>

  这是很简单的情况, 但是我的想法是要求自定义标签库能自动导入, 这样就不用在每一个模板里第一行加上类似 <tagLib name=article /> 这样的标签了.

  只是这遇到了一点问题

  2. 自动导入自定义标签库

  在config.php文件里加上:

   TAGLIB_PRE_LOAD => article ,

  清除缓存, 提示错误 实例化一个不存在的类! ;

  使用在TP官方论坛转了几圈, 发现只有一个方式能解决: 使用别名导入, 即在TP框架里的commonn/alias.php下添加导入的路径:

  如:

  复制代码 代码如下:TagLibArticle => THINK_PATH./Lib/Think/Template/TagLib/TagLibArticle.class.php,

  还有一些修改Template类源码的方案, 不好使 — 因为通常我不希望为了一点小问题修改核心.

  于是想到Action的导入:

  在自己的项目基类BaseAction.class.php里加入导入:

   function _initialize() { import(@.Mylibs.Tag.TagLibArticle); }

  刷新缓存, 问题解决…

  这方案简单好用.

  补充:

  使用TP的自动加载配置更加快捷:

   APP_AUTOLOAD_PATH=> Think.Util.,@.Mylibs.Tag.,

  最终方案:

  1. 建立Mylibs.Tag.TagLibTest — 自定义标签库

  2. 配置:

   APP_AUTOLOAD_PATH=> Think.Util.,@.Mylibs.Tag., TAGLIB_PRE_LOAD => test ,

  删除缓存后既可正常使用.

  更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《smarty模板入门基础教程》及《PHP模板技术总结》。

  希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。


评论


亲,登录后才可以留言!