运行时改变图片脚本相对路径的smarty插件
web程序应用模板技术已经不是什么新鲜事了,但像smarty
这样的模板引擎在静态页面设计的时候还有php文件调用静态模板编译出可以执行的程序的时候,img src;link
rel;script;这些标签的里面的引用的外部路径就会发生变化了。以前我用保持img js
css等目录的两个copy来解决问题,但同步两个目录确实比较麻烦,后来见到有人说用smarty的prefilter是可以的。于是到csdn求了个正则式
,改成了一个smarty的plugin,用起来还不错。
然后在自己extends出来的模板类里使用:
在libcfg.php里加入TMP_DIR常量的定义:
<?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/'); ?> |
评论:
不错不错~~~
Posted by: sunu | 2006年05月12日 下午06时10分
谢谢这个插件。我现在做模板可以不用考虑路径的问题了。但是如果把
@import导入的CSS文件路径也考虑进去,还有表格的background,就更完美了
Posted by: 萧何 | 2007年10月28日 晚上11时01分
其实这只是一个解决问题的方法,而且并不一定是最好的,如果你有自己的web服务器,你可以用软链接的方法或者是直接使用相对于web服务器根路径的绝对地址如[/images/abc.css]这样的方式的。
特别在大访问量的站点上往往都会把image和css放到单独的服务器上的。所以你的图片和css根本就是在另外一个域名下,你写在模板里的都是完整的地址,这样的问题就不存在了。
Posted by: sleetdrop | 2007年10月29日 夜间12时15分
你好!我想问一下你说的这个具体怎么用呀!
我的QQ是:262340323 请高手帮忙呀!
Posted by: 风也 | 2008年02月19日 傍晚08时11分
把prefilter.chpath.php放到smarty的plugin目录然后在你的模板类里使用就可以了。
Posted by: sleetdrop | 2008年02月19日 晚上09时54分
我的QQ号是26234032 一直在线,能不能给个简单的实例,本人愚顿,还是不太明白,先谢谢了
Posted by: 风也 | 2008年02月20日 早上08时09分