php代码和界面的分离,smarty严重的路径问题。

     目前主流的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 就是你要修正的路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值