« 小葱大酱--恐怖版 | 首页 | 搭错车 »

运行时改变图片脚本相对路径的smarty插件

web程序应用模板技术已经不是什么新鲜事了,但像smarty 这样的模板引擎在静态页面设计的时候还有php文件调用静态模板编译出可以执行的程序的时候,img src;link rel;script;这些标签的里面的引用的外部路径就会发生变化了。以前我用保持img js css等目录的两个copy来解决问题,但同步两个目录确实比较麻烦,后来见到有人说用smarty的prefilter是可以的。于是到csdn求了个正则式 ,改成了一个smarty的plugin,用起来还不错。

<?php
/**
 * Smarty change design-time path to runtime path plugin
 *
 * File:     prefilter.chpath.php<br>
 * Type:     prefilter<br>
 * Name:     chpath<br>
 * Date:     May 11, 2006<br>
 * Purpose:  change design-time path to runtime path such as <link> <img src>               
 *           
 * Install:  Drop into the plugin directory, call
 *           <code>$smarty->load_filter('pre','chpath');</code>
 *           from application.
 * @author   sleetdrop <sleetdrop at gmail dot com>
 * @author Contributions from Gdj [http://community.csdn.net/Expert/TopicView3.asp?id=4645962]
 * @version  1.0
 * @param string
 * @param Smarty
 */

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".TMP_DIR."$4$5",$tpl_source);
}       


?>

然后在自己extends出来的模板类里使用:

<?php
//    继承smarty类构造自己的模版类,便于在整个系统中调用
    require_once('libcfg.php');
    require_once('Smarty/Smarty.class.php');
    class Template extends Smarty {
       
        function Template(){
            $this->Smarty();
            $this->template_dir = APP_ROOT.'templates';
            $this->compile_dir = APP_ROOT.'templates_c';
            $this->cache_dir = APP_ROOT.'cache';           
            $this->config_dir = APP_ROOT.'configs';
            $this->left_delimiter = '{{';
            $this->right_delimiter = '}}';
            $this->debugging = true;
            $this->caching = false;   
            $this->force_compile = true;
            //加载用于在运行时更改img link等标签   
            $this->load_filter('pre','chpath');         
           
        }
    }
?>

在libcfg.php里加入TMP_DIR常量的定义:
<?php
        define('APP_ROOT','/var/www/htdocs/somedir');
        define('TMP_DIR','templates/');
?>



引用:

本篇引用地址:
http://www.vetcafe.net/cgi-bin/mt3/mt-tb.cgi/2498

评论:

不错不错~~~

谢谢这个插件。我现在做模板可以不用考虑路径的问题了。但是如果把
@import导入的CSS文件路径也考虑进去,还有表格的background,就更完美了

其实这只是一个解决问题的方法,而且并不一定是最好的,如果你有自己的web服务器,你可以用软链接的方法或者是直接使用相对于web服务器根路径的绝对地址如[/images/abc.css]这样的方式的。
特别在大访问量的站点上往往都会把image和css放到单独的服务器上的。所以你的图片和css根本就是在另外一个域名下,你写在模板里的都是完整的地址,这样的问题就不存在了。

你好!我想问一下你说的这个具体怎么用呀!
我的QQ是:262340323 请高手帮忙呀!

把prefilter.chpath.php放到smarty的plugin目录然后在你的模板类里使用就可以了。

我的QQ号是26234032 一直在线,能不能给个简单的实例,本人愚顿,还是不太明白,先谢谢了

发表评论

(如果您以前没在这里发表过评论,也许您发表的评论需要Blog主人的审核才能显示在这里,感谢您的静候。)