文档章节

ThinkPHP框架定义自己的标签库

IamOkay
 IamOkay
发布于 2014/11/18 22:12
字数 974
阅读 1.2K
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

1.准备工作

thinkphp目前主流开发版本时 3.2.2,全面进入面向对象的时代了,但可能是个人水平的缘故,tp3.2.2+中的命名空间没怎么看懂过,所以用起来很吃力,也直接影响了自定义标签的扩展能力

先来看看系统自带的标签库,Cx.class.php是系统的内置标签库,Html.class.php可以认为是自定义标签库

1.1为什么说Cx.class.php是自定义标签库呢?

在tp默认的配置文件中有这样一个配置,当然也可以Html.class.php设置为内置标签库

1.2自定义标签库和内置标签库的使用有什么区别么?

自定义标签使用需要带前缀,当然通过某种方式也可以不带前缀,具体参阅http://document.thinkphp.cn/manual_3_2.html#taglib 

<html:editor id="editor" name="remark" type="KINDEDITOR"  ></html:editor>

这里需要说一下,由于水平原因,没弄懂命名空间,所以自定义标签库也只能放在 路径 ThinkPHP\Library\Think\Template\TagLib下了


其实说到这里,相信很多人已经回了,Html.class.php就在眼前,为什么不模仿一下呢,呵呵,没错,模仿吧

2.这里我定义了一个 Sql.class.php目录,如下放置

内容是(哎,万恶的命名空间啊~~)

<?php
namespace Think\Template\TagLib; 
use Think\Template\TagLib;

class Sql extends TagLib
{
    protected $tags = array(
         'list' => array('attr' => 'limit,order','close' =>1)// attr 属性列表close 是否闭合(0 或者1 默认为1,表示闭合)
	);
	
     public function _list($attr,$content)  //标签名 单划线开头
     { 

           $limit=$attr['limit'];//参数$limit,可通过模板传入参数值
           $order=$attr['order'];//$order$limit,可通过模板传入参数值
           $str='<?php ';
           $str .= '$field=array("id","title","hits");';//定义需要调用的字段
           $str .= '$_list_news=M("News")->field($field)->limit('.$limit.')->order("'.$order.'")->select();';//查询语句
           $str .= 'foreach ($_list_news as $_list_value):';
           $str .= 'extract($_list_value);';
           $str .= '$url=U("read/".$id);?>';//自定义文章生成路径$url
           $str .= $content;
           $str .='<?php endforeach ?>';
           return $str;
       }
 }
 
 ?>

3.使用方式

<!doctype html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Index|Home</title>
		<meta http-equiv="X-UA-Compatible" content="IE=7,chrome=1.0" />
		<script type="text/javascript" src="__PUBLIC__/Js/jquery.min.js"></script>
	</head>
	<body>
	        <!--导入标签库,多个用都好隔开-->
	        <!--注意,taglib标签在模板一个页面中只能出现一次,第二次出现无效,不信你可以试试哦-->
	        
		<taglib name="html,sql" />

		<foreach name="list" item="vo" >
    		{$key}|{$vo.id}:{$vo.name}<br/>
		</foreach>

		<html:editor id="editor" name="remark" type="KINDEDITOR"  ></html:editor>

		<ul>
			<sql:list limit="9" order="id desc">
	     		<li> <a title="{$title}" href="{$url}">{$title}</a></li>
	 		</sql:list>
 		</ul>
	</body>
</html>

~~~~~~~~~~~~~~~~~~成功的喜悦,悲伤的过程~~~~~~~~~~~~~~~~~~~~~~~~~~~

4.我们再来看看标签库是如何被解析的

呵呵,命名空间,也就是说这里基本上只往这个目录下放了。当然,这不是坏事,因为作为库存在的一般是依赖心比较低的,所以来说也推荐这么做,

这样可以为自己积累一些优秀的标签库,毕竟源码可以修改,如果你不敢修改,那你只能使用mvc传统方法查数据了。


5.为什么要使用自定义标签呢?

自定义标签解决的是重复性问题和全局性问题,通过自定义标签可以减少重复性工作,全局性问题是,代码重用度高,另外代码可读性高,通过简单的参数设定,就可以完成某些查询,从而也减少了控制器的代码,最后一点,自定义标签的可维护性也很好。


try doing it.

IamOkay

IamOkay

粉丝 206
博文 503
码字总数 422863
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
TDD的测试框架--Machine.Specification

Machine.Specification 是一个 TDD 测试驱动开发的测试框架,简化了测试,无需关心语言本身特性。 Machine.Specifications 带来的好处是不需要在代码里有注释,但同时阅读代码的人可以一目了...

匿名
2013/01/22
1.1K
0
mvc框架--Razor

Razor 是一个轻巧而优雅的servlet mvc框架 # 又一个轮子? no,写就她是为了证实我个人的某些想法,并在这个过程中练练手,这两种冲动碰撞在一起,自然而然地产生了Razor # Razor的现在和未来...

dtubest
2013/01/25
3.1K
0
XLSX读写库--EPPlus

EPPlus 是使用Open Office XML格式(xlsx)读写Excel 2007 / 2010文件的.net开发库。 EPPlus 支持: 单元格范围 单元格样式(Border, Color, Fill, Font, Number, Alignments) Charts 图片 形状...

匿名
2013/02/01
1W
2

没有更多内容

加载失败,请刷新页面

加载更多

C#中const和readonly有什么区别? - What is the difference between const and readonly in C#?

问题: What is the difference between const and readonly in C#? C#中const和readonly什么区别? When would you use one over the other? 您什么时候可以使用另一个? 解决方案: 参考一...

fyin1314
35分钟前
25
0
百度地图SDK新版内测邀请

本文作者:用****9 百度地图开放平台为开发者提供七大基础服务能力,其中地图SDK和导航SDK是开发者广泛使用的重要基础服务,为了满足开发者更多使用需求以及提升开发者集成后的应用效果,本次...

百度开发者中心
前天
19
0
获取JavaScript数组中的所有唯一值(删除重复项) - Get all unique values in a JavaScript array (remove duplicates)

问题: I have an array of numbers that I need to make sure are unique. 我需要确定一个唯一的数字数组。 I found the code snippet below on the internet and it works great until th......

javail
今天
11
0
如何检查字符串是否为空? - How to check if the string is empty?

问题: Does Python have something like an empty string variable where you can do: Python是否有类似空字符串变量的内容可以在其中执行: if myString == string.empty: Regardless, wh......

富含淀粉
今天
19
0
您如何存储未跟踪的文件? - How do you stash an untracked file?

问题: I have changes to a file, plus a new file, and would like to use git stash to put them away while I switch to another task. 我对一个文件进行了更改,再加上一个新文件,并希......

技术盛宴
今天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部