1.背景
最近在開發(fā)一套系統(tǒng),采用了smarty模板。根據(jù)不同用戶,要用不同模板,為了方便修改和維護(hù),將每一套模板都放在templates目錄下作為一個(gè)目錄存在,如默認(rèn)模板為templates/default。而且系統(tǒng)規(guī)模較大,后期需要不斷擴(kuò)展功能,所以并沒有把所有代碼和模板都放在根目錄下,而是分別為不同的功能建立不同的子目錄或?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.問題
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的值就搞定了,:)。
客戶問:如果我改變了根目錄的位置,或者換了域名,或者...?我們不希望自己去修改任何配置!
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 = "..";//根目錄在上一層目錄
?>
每次訪問目錄下的一個(gè)文件時(shí),require當(dāng)前目錄下的url_root.php取得該文件到根目錄的路徑。然后在smarty中
$tpl->assign("URL_ROOT",$URL_ROOT);就可以了
但是如果有很多文件,每個(gè)都加的話,修改維護(hù)起來也麻煩。
所以把這個(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è)令人頭疼的問題。
經(jīng)過多次修改后,個(gè)人感覺這個(gè)系統(tǒng)比較具有通用性了,用戶可以把整套系統(tǒng)放到網(wǎng)站的根目錄下, 或者作為一個(gè)子目錄,或者使用虛擬目錄,不用修改路徑配置,不用擔(dān)心路徑問題。唯一需要注意的是在開發(fā)模板時(shí),仍然使用相對(duì)于根的路徑,這樣是為了得到可視化效果,開發(fā)完成候,在路徑的最前面加入{$URL_ROOT}即可。
聯(lián)系客服