模板的原理類(lèi)似Smarty/ECShop這類(lèi)模板的原理如下圖所示。 
1.首先是編譯模板 ECShop/Smart是利用PHP引擎,所以編譯的結(jié)果是一個(gè)PHP文件,其編譯過(guò)程就是
將分隔符{}替換成PHP的標(biāo)準(zhǔn)分隔符<?PHP ?>, 將$var替換成 echo $var; 或者print $var; 將其他的比如foreach和if等也替換成標(biāo)準(zhǔn)的PHP語(yǔ)法。 將{include file…}之類(lèi)的則替換成標(biāo)準(zhǔn)的PHP的inlcude … 其余都是等效替換。
2.其次是生成編譯結(jié)果 編譯結(jié)果是PHP文件,并且編譯結(jié)果可以重用,所以這種文件會(huì)存到臨時(shí)緩存目錄里面。
3.利用PHP引擎執(zhí)行結(jié)果 輸出HTML結(jié)果。 ECShop模板的原理ECShop的模板原理和上面基本類(lèi)似,就是在編譯的時(shí)候和Smarty模板有所修改,比較重要的有一下幾點(diǎn):
1. 模板的執(zhí)行流程$smarty->display $smarty->fetch 返回HTML結(jié)果(所有模板)
$smarty->fetch_str (先編譯成PHP、在給變量賦值、計(jì)算結(jié)果) 1) $smarty->smarty_prefilter_preCompile (編譯成PHP) 2) $smarty->select (計(jì) 算每一個(gè)變量、表達(dá)式的結(jié)果,替換成標(biāo)準(zhǔn)PHP語(yǔ)法) 這一步是通過(guò)正則實(shí)現(xiàn)的,匹配每一個(gè){},將結(jié)果傳給 $smarty->select,改方法通過(guò)switch/case逐一分析,替換成對(duì)應(yīng)的表達(dá)式。 【所以添加自定義標(biāo)簽、自定義表達(dá)式可以修改此處?!?br> 3) $smarty->get_para $smarty->select通過(guò)調(diào)用get_para來(lái)實(shí)現(xiàn)獲取具體變量的值。 4) $smarty->get_val 而$smarty->get_para通過(guò)get_val來(lái)計(jì)算最終變量的值。 【自定義函數(shù)在此處添加,注意自定義函數(shù)和自定 義標(biāo)簽的區(qū)別】
$smarty->_eval 替換成標(biāo)準(zhǔn)的PHP文件后通過(guò)eval來(lái)執(zhí)行結(jié)果。 2. Lbi文件替換 在dwt文件中,類(lèi)似<!-- #BeginLibraryItem "/library/xxx.lbi" --><!-- #EndLibraryItem -->這樣代碼中間的所有的代碼 被替換成一個(gè) {include file /library/xx.lbi} 3. Editable的region替換 在dwt文件中,類(lèi)似 <!-- TemplateBeginEditable name="左邊區(qū)域" --><!-- TemplateEndEditable -->中間的內(nèi)容,都被 動(dòng)態(tài)替換。
替換原理 首先是get_dyna_libs($theme, $tmp)函數(shù)得到當(dāng)前theme下$tmp文件的所有動(dòng)態(tài)區(qū)域,該函數(shù)讀取數(shù)據(jù)庫(kù)中的記錄,按照后臺(tái)設(shè)置的順序排序。 返回的每個(gè)區(qū)塊有三個(gè)參數(shù),ID、Number、Type。 ID是標(biāo)識(shí),Number表示插入的個(gè)數(shù),Type有1、2、3、4,分別代表:分類(lèi)的商品、品牌的商品、文章列表、廣告位。 然后把每個(gè)<!-- TemplateBeginEditable name="區(qū)域名稱(chēng)" --><!-- TemplateEndEditable -->里面的內(nèi)容全部替換。 4. 自定義函數(shù)等 如上面所說(shuō),想增加自定義函數(shù)必須修改cls_template中的get_val方法(可以繼承),添加一些模板的自定義標(biāo)簽,需要修改cls_template 中的select方法,比如ECShop中自定義的insert、insert_script等函數(shù)就在此處。
|