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 编程请选择正确的文本编辑软件
Dec 21 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
分享一个php 的异常处理程序
Jun 22 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 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的ZIP压缩类分享
2014/05/04 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
js原型链原理看图说明
2012/07/07 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
详解Angular6 热加载配置方案
2018/08/18 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python中用于返回绝对值的abs()方法
2015/05/14 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
深入浅析python继承问题
2016/05/29 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
pytest中文文档之编写断言
2019/09/12 Python
python实现智能语音天气预报
2019/12/02 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
公共机构节能宣传周活动总结
2014/07/09 职场文书
人事局接收函
2015/01/31 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL