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中一个有意思的日期逻辑处理
Mar 25 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
Jul 04 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
3种php生成唯一id的方法
Nov 23 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP中number_format()函数的用法讲解
Apr 08 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
Apr 06 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
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
php批量修改表结构实例
2017/05/24 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
jQuery 位置插件
2008/12/25 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
python生成日历实例解析
2014/08/21 Python
详解python里的命名规范
2018/07/16 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
对Python w和w+权限的区别详解
2019/01/23 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
大学生英语演讲稿
2014/04/24 职场文书
群众路线领导对照材料
2014/08/23 职场文书
群众路线剖析材料
2014/09/30 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python