ECShop模板原理

模板的原理

類似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 -->中間的內容,都被 動態替換。

替換原理
首先是get_dyna_libs($theme, $tmp)函數得到當前theme下$tmp文件的所有動態區域,該函數讀取數據庫中的記錄,按照後臺設置的順序排序。
返回的每個區塊有三個參數,ID、Number、Type。
ID是標識,Number表示插入的個數,Type有1、2、3、4,分別代表:分類的商品、品牌的商品、文章列表、廣告位。

然後把每個<!-- TemplateBeginEditable name="區域名稱" --><!-- TemplateEndEditable -->裏面的內容全部替換。

4.       自定義函數等
如上面所說,想增加自定義函數必須修改cls_template中的get_val方法(可以繼承),添加一些模板的自定義標籤,需要修改cls_template 中的select方法,比如ECShop中自定義的insertinsert_script等函數就在此處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章