目前主流的WEB开发思想是,动态和静态的分离,即逻辑层和表示层的分离。当然,逻辑后面还有,逻辑层和数据层的分离;前面表示层还有,内容和风格的分离。
这里主要讲讲即逻辑层和表示层的分离,内容和风格的分离其实就是HTML的CCS化就不重点讲了。PHP开发中逻辑层和表示层分离的实现,开源的smarty给我们提供了很好的帮助,但是它的路径在将来的4.0版本中希望有所加强。
现在smarty最新是3.0以上版本,还未到4.0,它的主要问题是,开发人员的逻辑层和表示层是放在不同目录下,比如逻辑层以纯PHP为代表,表示层以纯HTML为代码,它们的目录关系可能是:
根目录\PHP
根目录\风格\HTML
大致是这样,具体可能各有不同,相同的是PHP和HTML不在同一目录。但smarty流程是,先运行PHP,然后再加载HTML;最后生成网页的默认图片、CSS、JS等路径是以PHP所在目录出发的相对路径。但这与我们的开发习惯不同,我们开发的习惯是图片、CSS、JS跟着HTML的路径。
解决方法有很多,提供一种smarty自带的过滤器功能,就是在最后生成网页的时候再过虑一次。要实现这个功能需要先注册过滤器:
@$smarty->registerFilter('output','smarty_output'); // 注册后置过滤器 output 是参数,后置的意思;smarty_output 就是你自定义的函数,也就是最后要运行的函数,在里面加入修正的代码,我是抄了ECSHOP的修正代码
function smarty_output($tpl_source,$smarty)
{
$tmp_dir = 'themes/' . $GLOBALS['template'] . '/';
$pattern = array(
'/<!--[^>|\n]*?({.+?})[^<|{|\n]*?-->/', // 替换smarty注释
'/<!--[^<|>|{|\n]*?-->/', // 替换不换行的html注释
'/(href=["|\'])\.\.\/(.*?)(["|\'])/i', // 替换相对链接
'/((?:background|src)\s*=\s*["|\'])(?:\.\/|\.\.\/)?(images\/.*?["|\'])/is', // 在images前加上 $tmp_dir
'/((?:background|background-image):\s*?url\()(?:\.\/|\.\.\/)?(images\/)/is', // 在images前加上 $tmp_dir
'/([\'|"])\.\.\//is', // 以../开头的路径全部修正为空
);
$replace = array(
'\1',
'',
'\1\2\3',
'\1'.$tmp_dir.'\2',
'\1'.$tmp_dir.'\2',
'\1'
);
$tpl_source=preg_replace($pattern,$replace,$tpl_source);
$tpl_source = preg_replace('/(<link\shref=["|\'])(?:\.\/|\.\.\/)?(css\/)?([a-z0-9A-Z_]+\.css["|\']\srel=["|\']stylesheet["|\']\stype=["|\']text\/css["|\'])/i','\1' . $tmp_dir . '\2\3', $tpl_source);
$tpl_source = preg_replace('/(<script\s(?:type|language)=["|\']text\/javascript["|\']\ssrc=["|\'])(?:\.\/|\.\.\/)?(js\/[a-z0-9A-Z_\-\.]+\.(?:js|vbs)["|\']><\/script>)/', '\1' . $tmp_dir . '\2', $tpl_source);
$tpl_source=preg_replace("/(<(iframe.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".$tmp_dir."$4$5",$tpl_source);
return $tpl_source;
}
$tmp_dir 就是你要修正的路径。