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实现的功能是显示8条基色色带
Oct 09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
May 12 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 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中substr()函数参数说明及用法实例
2014/11/15 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
Python实现基于HTTP文件传输实例
2014/11/08 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
详解Python传入参数的几种方法
2019/05/16 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
10个顶级Python实用库推荐
2021/03/04 Python
当当网软件测试笔试题
2015/11/24 面试题
实习协议书范本
2014/09/25 职场文书
工程款申请报告
2015/05/15 职场文书
2015国庆节感想
2015/08/04 职场文书
简短清晨问候语
2015/11/10 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang