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