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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
php Calender(日历)代码分享
Jan 03 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
PHP date函数常用时间处理方法
May 11 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
Yii2实现中国省市区三级联动实例
Feb 08 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 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
基于mysql的bbs设计(三)
2006/10/09 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
Symfony的安装和配置方法
2016/03/17 PHP
PHP单链表的实现代码
2016/07/05 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
python中cPickle用法例子分享
2014/01/03 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python 安装移动复制第三方库操作
2020/07/13 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
生产车间实习自我鉴定
2013/09/23 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers