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 DataGrid 实现代码
Aug 12 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
php获取twitter最新消息的方法
Apr 14 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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实现文件上传二法
2006/10/09 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python类的实例化问题解决
2019/08/31 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python过滤序列元素的方法
2020/07/31 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
展会邀请函范文
2014/01/26 职场文书
成立公司计划书
2014/05/07 职场文书
运动会演讲稿100字
2014/08/25 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫