1.背景 最近在開(kāi)發(fā)一套系統(tǒng),采用了smarty模板。根據(jù)不同用戶,要用不同模板,為了方便修改和維護(hù),將每一套模板都放在templates目錄下作為一個(gè)目錄存在,如默認(rèn)模板為templates/default。而且系統(tǒng)規(guī)模較大,后期需要不斷擴(kuò)展功能,所以并沒(méi)有把所有代碼和模板都放在根目錄下,而是分別為不同的功能建立不同的子目錄或?qū)O目錄,如user目錄存放與用戶相關(guān)文件,system目錄存放與系統(tǒng)相關(guān)的文件,templates/default/system/system_info.tpl是系統(tǒng)信息默認(rèn)模板文件。
2.系統(tǒng)目錄結(jié)構(gòu) 大致如下 root |--includes (系統(tǒng)包含文件) |--templates (模板文件) |--default |--css |--images |--user |--system |--system_info.tpl |--blue |--css |--images |--user |--system |--system_info.tpl |--templates_c |--cache |--js |--smarty (smarty所有類文件) |--user |--system (與系統(tǒng)相關(guān)的文件) |--system_info.php
3.問(wèn)題 1).最初在模板文件中使用了絕對(duì)路徑(相對(duì)于站點(diǎn)根的路徑 ).如在system_info.tpl中圖片是這樣顯示的 <img src="/templates/default/images/logo.gif"/> 這樣當(dāng)系統(tǒng)發(fā)布時(shí),必須要把系統(tǒng)目錄作為網(wǎng)站的根目錄圖片才能正確顯示。但客戶的要求是該系統(tǒng)可能只是一個(gè)虛擬目錄或者子目錄。這樣網(wǎng)站必布時(shí)就必須修改圖片路徑為真實(shí)路徑。如果文件很多,這種修改就很麻煩(雖然可以用文件替換功能)。但是如果有N個(gè)客戶,每個(gè)客戶N個(gè)模板...
2).將模板文件修改如下 <img src="{$URL_ROOT}/templates/default/images/logo.gif"/> $URL_ROOT在一個(gè)全局配置文件中設(shè)置。這樣只要改變$URL_ROOT的值就搞定了,:)。 客戶問(wèn):如果我改變了根目錄的位置,或者換了域名,或者...?我們不希望自己去修改任何配置!
3).模板文件不變 <img src="{$URL_ROOT}/templates/default/images/logo.gif"/> 在每個(gè)目錄下新建一個(gè)url_root.php文件,存放當(dāng)前目錄到根目錄的相對(duì)路徑。 如system/url_root.php如下
<?php $URL_ROOT = "..";//根目錄在上一層目錄 ?> 每次訪問(wèn)目錄下的一個(gè)文件時(shí),require當(dāng)前目錄下的url_root.php取得該文件到根目錄的路徑。然后在smarty中 $tpl->assign("URL_ROOT",$URL_ROOT);就可以了 但是如果有很多文件,每個(gè)都加的話,修改維護(hù)起來(lái)也麻煩。 所以把這個(gè)操作封裝到smarty的子類中,只修改一個(gè)文件就可以了。
includes/MySmarty.php 文件內(nèi)容如下:
<?php
//定義服務(wù)器中的根目錄的絕對(duì)地址
define("WEB_ROOT",realpath(dirname(__FILE__)."/.."));
//加載smarty類文件
require_once(WEB_ROOT."/smarty/Smarty.class.php");
//擴(kuò)展smarty類
class MySmarty extends Smarty
{
function MySmarty()
{
$this->Smarty();
$this->template_dir = WEB_ROOT.'/templates/default/';
$this->compile_dir = WEB_ROOT.'/templates_c/';
$this->config_dir = WEB_ROOT.'/configs/';
$this->cache_dir = WEB_ROOT.'/cache/';
$this->caching = false;
//加載引用當(dāng)前類的文件所在的目錄到根目錄的相對(duì)地址
require_once("./url_root.php");
//為模板路徑賦值
$this->assign("URL_ROOT",$URL_ROOT);
$this->assign('app_name', 'OA System');
}
}
?>
這樣系統(tǒng)中的任何一個(gè)使用模板的文件不需要修改,就可以直接給URL_ROOT賦值了.
4.總結(jié) 用smarty使用多套模板時(shí),絕對(duì)路徑,相對(duì)路徑,界面可視化是個(gè)令人頭疼的問(wèn)題。 經(jīng)過(guò)多次修改后,個(gè)人感覺(jué)這個(gè)系統(tǒng)比較具有通用性了,用戶可以把整套系統(tǒng)放到網(wǎng)站的根目錄下, 或者作為一個(gè)子目錄,或者使用虛擬目錄,不用修改路徑配置,不用擔(dān)心路徑問(wèn)題。唯一需要注意的是在開(kāi)發(fā)模板時(shí),仍然使用相對(duì)于根的路徑,這樣是為了得到可視化效果,開(kāi)發(fā)完成候,在路徑的最前面加入{$URL_ROOT}即可。
|