搜索
系统检测到您的用户名不符合规范:

改进模板标签,让标签更简洁一些

浏览:2146 发布日期:2015年11月01日 分类:技术分享 关键字: 模板 标签
相信有很多人和我一样用的是官方的模板引擎,提供了各类标签,还可以自己扩展标签系统,比直接写php要方便了很多,而且不需要懂PHP也能快速写出模板。
标签好用,但也有些让人感觉不爽的地方:
1. 重多的比较标签,到现在我也没能全记下来,用的时候得对着手册查,最烦的是如果比较的条件换了,标签也得换。官方比较推荐大家用这些标签,而少用if,我却if用得多;
2. 用<>做标记的标签和html混合一起不方便辨认,特别是一些判断标签嵌在html标签里面的时候;
3. 有些标签用变量的时候前面不能带$符号,有的又必须带上,这个也是容易犯错的地方;
4. volist用的是id属性表示当前元素,而foreach却用的是item属性,不知为何这样设计,好次几volist换成foreach后运行报错才发现id属性忘了改名成item;
5. 有的标签可以用.符号来表示数组元素,有的又必须用[]括起来(为了减少麻烦,我都全部用[],只是这样输入又慢些)。

我总希望标签用起来能更简单些,更方便些。于是想去改进这些标签,到最后却换了个思路重写了整个模板引擎。标签的替换不再是递归式的把标签对及中间的内容传值进行替换,而是用正则查找出标签后,一个循环就把所有的同类标签进行了替换,替换过程也只是把标签名传值进行替换,中间内容并不传入,所以替换效率提高了,也不再受嵌套层数的限制。

标签还是原来的那些,原来的用法也一样能用,只是有些标签加了一些自己认为更方便的用法。新加的功能如下:
1. 定界符
标签库和内置的普通标签可以使用一样的边界符,比如都用"{}",只要不重名不会相互干扰。这样这些标签就可以和html标签区分开。

2. 变量输出:
{$varname.aa.bb} 输出$varname['aa']['bb']。解析后的代码为: <?php echo $varname['aa']['bb']; ?>{$varname.aa ?? 'disabled'} 如果$varname为真则输出disabled。 解析后的代码为: <?php if(!empty($varname['aa'])) echo 'checked'; ?>{$varname ?: 'no'} 如果$varname为真则输出$varname,否则输出no。解析后的代码为: <?php echo !empty($varname) ? $varname : 'no'; ?>
{$varname ? 'yes' : 'no'} 如果$varname为真则输出yes,否则输出no。解析后的代码为: <?php echo !empty($varname) ? 'yes' : 'no'; ?>
{$varname ?= 'no'} 如果$varname有设置值则输出$varname,否则输出no。解析后的代码为: <?php echo isset($varname) ? $varname : 'no'; ?>
{$a==$b ? 'yes' : 'no'} 前面的表达式为真输出yes,否则输出no, 条件可以是==、===、!=、!==、>=、<=

{$create_time|date="y-m-d",###} 原来这种方式使用函数也是支持的,但个人觉得用下面的方式使用函数更直观一些,而且解析速度也快些。

3. 函数使用
{:substr($varname.aa, $varname.bb)} 解析之后就是 <?php echo substr($varname['aa'], $varname['bb']); ?>4. if标签<if condition="$varname.aa gt $now">
...
</if>
<if ($varname.aa gt $now)>
...
</if>
如果是用"{}"做边界符,还可以写成{if ($varname.aa >= $now)}
...
{/if}
中间的()也可以不写,上面的标签解析出来后效果是一样的

5. foreach标签
本来是想改写一下volist标签的,但volist有几个默认值,改了怕影响原来的使用,所以volist还是原来的一样,而把volist的一些功能加到foreach上了。由简到复说一下用法:{foreach ($list as $key=>$val)} .... {/foreach} 和php里的用法一样,解析之后也是最简洁的,如果$list不是一个数组会直接报错{foreach name="$list" id="val"} ... {/foreach}
{foreach name="list" item="val"} ... {/foreach}
这里foreach兼容了之前的写法,list前面不加$也可以,用id和item是一样的,加上id这个属性是想和别的标签保持一致。不指定key属性时默认是'key'。
这种写法解析出来后在foreach的外面会多套一个if(is_array($list)): 这样的判断语句,不是数组则循环不会执行。{foreach name="$list" id="val" key="k" index="i" offset="2" length="5" mod="2" empty="无数据"} ... {/foreach}当带有index属性时,就会多一个索引变量,值是从1到$list的长度,当key不是数字键名时可用来知道当前是第几个元素; 当要设置mod属性时,一定要加上index属性,不然mod无效; offset、length、empty这些属性和官方volist标签一样。

6. extend和block标签
extend标签支持多级继承, 如C继承了B, B又继承了A。模板C中的block会替换掉B和A中同名block标签。

7. include标签
include标签支持多层嵌套,可以传变量。如:{include file="Public/nav" selected="{$id}" item="index" /}在Public/nav这个文件中用[selected]和[item]就能引用到相应的值。

有兴趣的朋友可以测试一下。有三处文件需要替换: Library/Think/Template.class.php、Library/Think/Template/TagLib.class.php、Library/Think/Template/TagLib/Cx.class.php,替换前请先做好备份。替换后不用改动配置,原来的标签应该能正常使用。
如果有自己写了扩展标签,并且扩展标签中还引用了template.class.php中的方法,因一些方法的改动可能会出现报错。

可能还有一些没测试到的bug,如发现模板解析错误的地方请告知,有什么建议也可以一起交流。
注:11月3日中午之前下载了的朋友请重新下载,修复了一处bug。

附件 Template.rar ( 15.3 KB 下载:32 次 )

最佳答案
评论() 相关
收藏
oldrind
积分:5072 等级:LV4
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /