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


Posted in PHP onJuly 20, 2016

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

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

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

使用Examples下的Tag演示文件

<?php
// +-----------------------------------------------------------
// | ThinkPHP
// +------------------------------------------------------------
// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
// +------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +------------------------------------------------------------
// | Author: liu21st <liu21st @gmail.com="">
// +------------------------------------------------------------
// $Id$
import('TagLib');
class TagLibArticle extends TagLib{
 // 标签定义
 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>内容</td>
 </tr>
</thead>
  <article:article name="form" limit="10">
  <tr>
   <td>{$article.id}</td>
   <td>{$article.title}</td>
   <td>{$article.content}</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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的类 功能齐全的发送邮件类
Oct 09 PHP
php 之 没有mysql支持时的替代方案
Oct 09 PHP
PHP 调试工具Debug Tools
Apr 30 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
PHP中echo和print的区别
Aug 28 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
php自定义函数实现二维数组排序功能
Jul 20 #PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 #PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 #PHP
PHP+Ajax验证码验证用户登录
Jul 20 #PHP
PHP+Ajax实现验证码的实时验证
Jul 20 #PHP
php+ajax注册实时验证功能
Jul 20 #PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 #PHP
You might like
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
Python操作CouchDB数据库简单示例
2015/03/10 Python
简单理解Python中基于生成器的状态机
2015/04/13 Python
Python复制文件操作实例详解
2015/11/10 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
护理专业自我评价
2015/03/11 职场文书
2015年仓库工作总结
2015/04/09 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL
Moment的feature导致线上bug解决分析
2022/09/23 Javascript