道可道,非常道—PHP模板技术

道可道,非常道—PHP模板技术

道可道,非常道。

当我第一次见到php模板的时候,简直被迷上了。原来php世界里还有这么好的东西。我疯狂地学习。
好在当时的php模板还不是很庞大,很快我了解了它的原理,并也能自己写一些了。
后来,smarty横空出世,更是拥有了许多为它着迷的fans.许多人开始写模板引擎,将smarty或其他模板加以改造,使之符合自己的需要。
纵观当今模板世界,php模板引擎主要分为两种:
一种是替换特定字串型的。美工做出来的页面,中间会嵌入一些什么{block.title}这样的字符串,然后程序读入这个模板文件,将中间的{block.title}的字样替换成实际从数据库中读取的内容。
还有一种符杂一些,是一种编译型的。以smarty为代表,模板文件中实际上包含了一些简化的php代码,比如有的写的是<{=$site_name}>,<{if $counts>0 }>这样的语句,实际是一种自行定义的语言格式。web开发久的人一眼能看出它们指的是什么。这一类往往会在第一次访问时被预编译,转换成一个php文件何存起来。比如 <{=$site_name}>就变成了,<{if $count>0 }> 就变成了0) {?>。从第二次起,就直接包含已经编译出来的php文件。当然,各种模板的处理的具体细节不一样。

但是,我们为什么要用模板?
这个问题我也不能很好的回答。但是有很多人这么说:要让美工和程序员的工作分开。要让代码层和表现层分开。
那么我们看这两种方式实现了吗?
让您的美工人员打开一个smarty文件,让他按他的思路去改一下视图设计。他会告诉您,天哪,你怎么把我的设计变成这样一幅样子了?这些foreach,if都是什么意思?噢,天哪,我的表格怎么撑得这么大了?….
原来编译型的模板技术让美工更没法子做美工了。
那么替换字符串型的呢?看起来是轻松多了。不过您可以测测您的程序速度,看看他是否已经慢了一倍以上。很容易,您用了太多的有preg_match,或是str_ireplace之类的语句来替换。程序重复一次又一次在您那几万个甚至更多字节的模板文件中查找某个字串,来替换内容。
不仅如此,你还发现您哪天想在视层面插一点东西时,处处受制于模板。您肯定很想直接在模板中写一段之类的语句,但是,很抱歉,您不能这么写。如果只是想echo 一个什么东西,您可以在模板中加一个{{var}}的串,然后在php程序中写
$var=”这一个串”;
$template->assign(“var”,$var);
但是如果您不是想输出呢,想做其他操作?抱歉,您还是得改php代码。这些模板都支持规矩矩的表格状的输出,但是,如果我想输出20条记录,我要弄一个第一行2列记录的,第二行3列的,第三行又是2行的之类的,或者是其他类似找码,您打算怎么办?
难道再让您的模板引擎也升级成为编译性的,好让您往您的模板中加入php语句?

您错了。其实,我们看一看,我们的模板引擎充当了什么样的角色呢?我们把一段特定的按一定规则编写的html代码进行一定的数据处理后输出成了另外一段,输出过程中某些字符发生了改变。那我们的伟大的php干了什么呢?它帮我们把我们按规则写好的php代码也按一定规则输出成了一段html。两者本质是一样的。只是,php本身比我们那些蹩脚的模板引擎更快,更漂亮。
再说细一点,现在用的最多的Smarty.看一看它的结构:

<{if $article.rates}>
<{php}>echo art_constant(“MD_RATE”);<{/php}>:
<{$article.rating}>/<{$article.rates}>
<{/if}>

你觉得它是一个美工能看清的html文件么?
看看编译后的结果,它看起来应该是这样的:


:
/


哈。我们伟大的smarty把这html也变成了php了。然后在以后的工作中,这些php代码会直接被运行。
有必要吗?本来是apache承载php,php直接编译php 源代码,现在变成了apache承载php,php编译smarty引擎,smarty引擎又去编译html文件。反而多了一层,smarty自个儿把本来php要做的工作拿了做了。
而且糟糕的是,smarty的模板打开来以后,比php文件更让人难以看清。
所以我说,放弃您的模板系统吧。但记住我们开发模板系统的初衷。

您会说:那要是放弃模板系统了,我怎么分开程序逻辑和视图层面?
这个也太好办了。您可以这样写:
第一个文件这样写:


@link http://www.162cm.com
*/
$rs=mysql_query(“select id,title,body from articles order by id desc limit 30”);
while($row=$mysql_fetch_assoc($rs))
{
$rows[]=$row;
}
?>

第二个文件作为您的视层面的文件。您可以让您的平面设计师在mac上设计漂亮绝顶的图片,然后切成html文件,交给您的页面整合工程师。这个工程不需要懂太多php,他基本上只需要会用print就行了。他把这个html文件改名为view.php,然后在里面加上相应代码:


@link http://www.162cm.com
*/
foreach($rows as $row)
{
echo “

“;
echo “

“;
echo $row[“id”];
echo “

“;
echo “

“;
echo $row[“title”];
echo “

“;
echo “

“;
}
?>

ok.这就视层面文件。这个文件用织梦者(dreamweaver)打开后,应该跟美工做出来的图是一样的,就仅仅多了用那个黄色的问号代表的php代码。写得好时,dreamweaver还能列出您的php代码中输出了什么内容,效果更佳。
这两个文件,就是一个是逻辑层,一个是视层面。
然后用index.php将他们包含起来。


@link http://www.162cm.com
*/
include “databaseConnect.php”;//连接数据库的代码,我就不写了
include “logic.php”;
include “view.php”;
include “cache.php”;
?>

这样逻辑和视,就分开了。那有人会说,如果我用模板,可以将要输出的内容写入到静态文件中,现在没了模板我该怎么办?
这个不是问题。我们用的是php,超酷的php.
看看,我们加了cache.php.这就是用来实现您说的缓存效果的。
我们的cache文件:


@link http://www.162cm.com
*/
$content=ob_get_content();
$fp=fopen(“index.html”,”w”);
fwrite($fp,$content);
fclose($fp);
?>

当然,index.php也改成:


@link http://www.162cm.com
*/
if(file_exists(“index.html”))
{
include “index.html”;
exit();
}
include “databaseConnect.php”;//连接数据库的代码,我就不写了
include “logic.php”;
include “view.php”;
incldue “cache.php”;

?>

这样您看这缓存效果是不是就出来了?

有人说:我用模板还有一个好处啊,就是模板写错了还不会影响到程序的运行。是的。咳,怎么说呢?您在模板中将<{=$site_name}>写成了<{=$sie_name}>是没啥,您的php程序还是很”健壮”地运行着。不过您没觉得,当您期望的那一个将由<{=$site_name}>来打出来的网站名称没有出现的时候,您排起错来会很难找吗?对于一个程序师来说,您不觉得,光只视层面的那些echo语句,只应该是您工作中极微不足道的一部分吗?在这个主要是echo语句构成的视层面文件view.php,您还出现编译期错误,是不是该拉出去打屁屁?

另外,在php程序正式上线运行时,您也可以将它的报错功能关闭啊。

常道,亦非常之道。
无为,无所不为。

替女友感谢一些曾经关注过帮忙过的朋友

她不打算来北京了.北京这边一些单位的面试她也不参加了.
我白忙活了.害大家也白忙活了,对不住.尤其今晚还加我msn问她的情况的朋友.
谢谢各位的关心.
只怪我无能,到现在还啥都没混上。女人不愿意过不确定的生活,我理解。现实的比梦想中的更可靠。每个人都不喜欢冒风险。女人最甚。
有些事注定会发生。正如天要下雨,拦不住的。
我尽力为之。若事难成,我自己接受自己的惩罚而已。
睡吧。不早了。
上班,打卡。
生活。。。
活着。。。

又要做擦屁股的事

上半年,就光在做给人擦屁股的事。
这次是全新开始,倒是不用擦了,不过现在xoops在使用中也有问题,看来的得给xoops擦擦屁股了。
xoops现在确定的不足之处有:

1:保留了太多的古老的代码,速度不够快。
2:设计时考虑了区块,风格,但仍然不能解决一个大问题:就是目前大多数的xoops看起来都太单调,设计上难以突破。这也是因为美工能做的事太少—Xoops的模板/风格文件打开以后,每个美工看了都会头晕。
3:设时之初没有考虑到AJAX应用问题。
4:搜索引擎优化工作没有做好,应该有选择地应用mod_rewrite

但是xoops有如此多的插件支持,所以,难以舍弃。那只好再给它擦屁股了。一个字,改.

Cakephp在Windows Server上无法用mod_rewrite的问题

有些朋友问在windows 2003 上为什么无法正常使用cakephp.
环境是Win2003+ Apache+PHP4.4.4
我自己试了一下,可能是这样几个原因:
1.Apache中没有启用mod_rewriet选项。
可以打开apache安装目录中的conf/httpd.conf,找到这样一行:

#LoadModule rewrite_module modules/mod_rewrite.so

把前面的#去掉,变成:

LoadModule rewrite_module modules/mod_rewrite.so

(Apache 2中没有这一步)并找到

#AddModule mod_rewrite.c

也把#去掉,变成

AddModule mod_rewrite.c

就顺利地启用了mod_rewrite.Windows版本一般都带有mod_rewrite.so文件。

2.”.htaccess”文件不存在或错误。
在winxp或Windows 2003中,是不允许直接建立”.htaccess”文件的。windows要求我们建立文件时可以不要扩展名,但必需要输入主文件名。不过我们有一个超级简单的办法:直接让朋友给传一个.htaccess文件,哈哈,windows没有限制下载并保存这样的文件。
还有一种方法,要能要麻烦一些,但在找不着人帮忙时也是有效的:
打开apache安装目录中的conf/httpd.conf,找到这样一行:

AccessFileName .htaccess

将之改为你想取的名字,比如: stupidcake.htaccess:

AccessFileName stupidcake.htaccess

哈哈,这就可以了。你现在不用建立.htaccess这个文件,只需要建立stupidcake.htaccess文件就行了。不过千万不要太傻,又改个什么”.ht”之类的文件名.

燥动…

难受。真想找一安静的地方,过过青灯古佛的生活。
又一个创业者了。
找我,我心里也乱。我对自己现在做的不满意,但和他们一起做,薪水是涨了许多,可是我也未必对自己的表现满意。我真不知如何我才对自己满意。
联想到几天前老同学找我一起干,不知道这个世界怎么了。
我会是一个好创业者吗,我想。
不得不把被我一师兄挂在msn上觉得颇有感触的话贴出来:(这话好像也是我说的,她挖我过去,我当时不知道想什么,这么说了一句)
我究竟喜欢什么,追求什么,想得到什么?

创业,亿万富翁,80后富翁,可能离我非常远。我还是好好打工。骂我是懦夫吧。我一辈子就只配给别人打工了。
一个月之前某个人说的话,我会记住一辈子。