Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1649479
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2012-08-03 09:23:15

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可以使用的原因了,但是为什么可以用确达不到想象中的效果呢?我们在看相关的代码。
仅摘录关键部分
  1. [size=3][size=6][size=3][size=5]$modifier = $single_modifier[0];[/size][/size][/size][/size]
  2. [size=3][size=6][size=3][size=5] $single_modifier[0] = $output;[/size][/size][/size][/size]
  3. [size=3][size=6][size=3][size=5] $params = implode(',', $single_modifier);[/size][/size][/size][/size]
  4. [size=3][size=6][size=3][size=5] ......[/size][/size][/size][/size]
  5. [size=3][size=6][size=3][size=5] $output = "{$modifier}({$params})";[/size][/size][/size][/size]
  6. [size=3][size=6][size=3][size=5] ......[/size][/size][/size][/size]
  7. [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行
  1. [size=3][size=6][size=3][size=5]$modifier = array_shift($single_modifier);[/size][/size][/size][/size]
  2. [size=3][size=6][size=3][size=5] $params=implode(',', $single_modifier);[/size][/size][/size][/size]
  3. [size=3][size=6][size=3][size=5] if (preg_match("/['\"]###['\"]/",$params)){[/size][/size][/size][/size]
  4. [size=3][size=6][size=3][size=5] $params=preg_replace("/['\"]###['\"]/",$output,$params);[/size][/size][/size][/size]
  5. [size=3][size=6][size=3][size=5] }else{[/size][/size][/size][/size]
  6. [size=3][size=6][size=3][size=5] $params = trim($output.','.$params,',');[/size][/size][/size][/size]
  7. [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) |
给主人留下些什么吧!~~