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 相关文章推荐
WINDOWS 2000下使用ISAPI方式安装PHP
Sep 05 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 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
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
Python中的pprint折腾记
2015/01/21 Python
Python中实现的RC4算法
2015/02/14 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python二进制文件的转译详解
2019/07/03 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
PyQt QMainWindow的使用示例
2021/03/24 Python
初中三好学生自我鉴定
2014/04/07 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
小学教师教学反思
2016/02/24 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
话题作文之诚信
2019/11/28 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
Pytest之测试命名规则的使用
2021/04/16 Python
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP