smarty经过3天已经学完了,虽说都是很浅的很简单的应用,但是足以满足我们日常需求。
师傅领进门,修行在个人,而能学到什么程度最主要就是看你的心态了,你想学到什么程度就可以学到什么程度。以下是我总结的2种学习方法。学习方法一:学会挖掘 第一节课的时候我们提到了{$foo="abc"}这样的赋值方法,善于挖掘的人应该想到,在php中
单引号和双引号有着不同的用处,而在前两天学习javascript的时候,单引号和双引号可以说同样的作用,那么在smarty中呢?通过尝试我们可以逐步挖掘出来很多东西 $smarty->assign('tabledata',array(1,2,3,4)); 1、{$foo='$tabledata'}{$foo|var_dump} 结果为:string '$tabledata'
(length=10) 2、{$foo="$tabledata"}{$foo|var_dump} 结果为:string 'Array' (length=5)
简单的想一下我们就可以知道为什么这样变成了Array(你可以echo一个数组看看结果), 那么如果传递变量的值呢?联系php语法我们得到下面的 3、{$foo=$tabledata}{$foo|count} 结果为想想中的4 这是变量,对于其他呢? 4、试下这3种 {$foo="6"}{$foo|var_dump} {$foo='6'}{$foo|var_dump} {$foo=6}{$foo|var_dump} 结果是 string
'6' (length=1) string '6'
(length=1) int
6 你可以得到什么结论呢? 5、在试下这3种 {$foo="a"}{$foo|var_dump} {$foo='a'}{$foo|var_dump} {$foo=a}{$foo|var_dump} 结果是 string
'a' (length=1) string 'a'
(length=1) string 'a'
(length=1) 你又能得到什么结论呢? 对于一个简单的赋值就可以发现如此多的东西,那么学到什么程度完全就可以说是在你自己想学到什么深度。学习方法二:站在高处 我对我同桌小芳说过这样的话,“如果你死揪着手册,那么就像是站在山脚看大山,你可能视力好,能看清楚很多,但是不可能有‘掌控’的感觉;但是你通读代码在去学,那么就像爬到山顶看大山,有一种‘万物掌控于胸’的感觉”。 在上面例子中我为什么使用了var_dump,count这两个php内置函数并且有效,而为什么str_replace,date这样的函数却不能用了,如果你看过smarty的代码看到过关于变量调节器的处理,我想你一定会搞清楚这个问题的。 在
smarty中,载入变量调节器是有一定顺序的。先看这个调节器是否是注册的,如果不是注册的在看在插件目录是否可以找到这个插件,如果找不到才会去尝试看这是不是一个php的内置函数。这就是为什么str_replace,date可以使用的原因了,但是为什么可以用确达不到想象中的效果呢?我们在看相关的代码。 仅摘录关键部分
- [size=3][size=6][size=3][size=5]$modifier =
$single_modifier[0];[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $single_modifier[0] =
$output;[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $params = implode(',',
$single_modifier);[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] ......[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $output =
"{$modifier}({$params})";[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] ......[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] return
$output[/size][/size][/size][/size]
上面这段代码可以很清楚的解释出为什么 比如{$a|str_replace:"a":"b"}这个最后解析成$single_modifier=array('str_replace','a','b');$output=$a; 然后通过上面代码
最后解析成了str_replace($a,'a','b');而我们想要的是str_replace('a','b',$a); 既然知道了原因,那么改起来也相当的容易,我们可以改写成类似thinkphp的形式 {$a|str_replace:"a":"b":"###"} 这样所有php内置函数有被我们激活了,并且也不用记那些很绕的变量调节器,比如date_format
,比如escape 等等。 我修改的代码
sysplugins/smarty_internal_compile_private_modifier.php
约36-38行
- [size=3][size=6][size=3][size=5]$modifier =
array_shift($single_modifier);[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $params=implode(',',
$single_modifier);[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] if
(preg_match("/['\"]###['\"]/",$params)){[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $params=preg_replace("/['\"]###['\"]/",$output,$params);[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] }else{[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] $params =
trim($output.','.$params,',');[/size][/size][/size][/size]
- [size=3][size=6][size=3][size=5] }[/size][/size][/size][/size]
这样在保留了smarty原有功能的基础上扩展了php内置函数的支持。
当然,这里我并不是反对看手册,比如不看手册,我根本不知道smarty3中{}左右分隔符基本上不会引起js和css的冲突了,也不能快速对smarty3的变化做出一定了解。
end.
ps:
工欲善其事必先利其器,老师给的smarty3中文手册不太犀利,感觉就是smarty2的手册加了几个smarty3的内容,使我开始走了不少弯路,偶然在官网看到smarty官网提供有smarty3的中文手册,只是没有提供下载,于是下载下来,并且打包整理做了个chm包,共享给大家。
当然,最要要感谢下小芳的大力支持,自从有了小芳的宵夜,即使晚上跑步,两个星期还是胖了2斤,我的减肥大业啊......
亲,回复就能得到绝版smarty3中文手册,还包邮哦,还是美女快递员。
rar打包版: chm版:
原文地址:
阅读(315) | 评论(0) | 转发(0) |