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数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
PHP中的函数-- foreach()的用法详解
Jun 24 PHP
php获取域名的google收录示例
Mar 24 PHP
PHP文件上传类实例详解
Apr 08 PHP
抛弃 PHP 代价太高
Apr 26 PHP
PHP生成静态HTML文档实现代码
Jun 23 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 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操作mysqli(示例代码)
2013/10/28 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
java解析json方法总结
2019/05/16 PHP
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
python概率计算器实例分析
2015/03/25 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
临床护士自荐信
2014/01/31 职场文书
演讲稿的写法
2014/05/19 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
婚礼父母答谢词
2015/01/04 职场文书
困难补助申请报告
2015/05/19 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
Nginx配置Https安全认证的实现
2021/05/26 Servers