太忙了,忙得網站不能更新,網站在百度排名沒上去,聽說百度的搜索算法又改了,做SEO工作you'j。現在抽出時間繼續完成沒有完成的的工作。今天就接上一篇文章繼續講dedecms的靜態頁面生成過程。
簡單回顧一下,前面我們首頁動態文件index.php調用arc.partview.class.php來初始化首頁模板,arc.partview.class.php通過SetTemplet調用DedeTagParse,在設置首頁模板的時候,解析了模板,並生成模板的緩存或者說序列化文件。雖然模板被解析了,但是這種解析的只是把所有標籤在模板中的位置以及他們的參數記錄下來,並沒有填充數據,接下來估計就要幹這些事情了。
我們回到partview的SetTemplet方法,從$this->dtp->LoadTemplet($temp);這句往下看吧。
下面if($this->TypeID > 0)這個if語句是設置當前頁面的“麪包屑導航”和標題。如果你使用過dedecms,對dedecms系統的操作比較熟悉,應該瞭解這個if裏面的$this->Fields['title']這種數組元素,在頁面模板中很多地方都是用了fields數組呢。
設置了兩個變量,接下來就調用ParseTemplet解析模板啦。
這個ParseTemplet很簡單,設置了一大堆全局變量,一看就知道了,頁面裏面用的什麼channelid,topid之類的東西,有興趣的朋友可以自己細緻研究一下。我們注意到ParseTemplet方法最後一句,MakeOneTag($this->dtp,$this); 因爲前面的東西都是沒什麼實質性的,這個應該很關鍵了。找到這個函數看看吧。
先看看MakeOneTag函數的參數,前兩個參數都是引用傳遞的,第一個參數是傳入DedeTagParse的實例,第二個參數是傳入partview的實例。
開始用一個循環獲取系統所擁有的所有標籤列表
$dh = dir(DEDEINC.'/taglib');
while($filename = $dh->read()){
if(ereg("\.lib\.",$filename)){
$alltags[] =str_replace('.lib.php','',$filename);
}
}
$dh->Close();
代碼很簡單,就是遍歷/include/taglib目錄,根據文件規則取文件名,形成一個所有標籤的數組。
接下來就是一個大的foreach數組了,遍歷在partview類中實例化並解析了當前模板的DedeTagParse的實例的CTags屬性,我們通過前面對DedeTagParse的分析知道CTags實際上是模板中所有使用的標籤及其參數的集合而已,這裏就開始遍歷這些模板上的標籤進行賦值,替換之類的啦。
我們繼續看這個foreach都幹了什麼。
先獲取循環中當前標籤的名字。
接下來是針對標籤名爲field的標籤的操作。
如果是field標籤的時候,先獲取標籤的name屬性,當名字是array的時候則通過DedeTagParse的Assign方法把partview的Fields數組賦給標籤名對應的值屬性(詳情看Assign的代碼,由於比較簡單這裏略過)。如果標籤name屬性不是array,則把partview的Fields數組中指定名字的值賦給標籤對應的值。下面的else是進行一些其他判斷也很簡單,然後field標籤就解析完了,這樣我們就知道了field標籤就是相當於變量,此處就是給這些變量賦值,解析完之後,就繼續循環分析下個標籤了。
接下來的兩個if是做標籤名字的兼容性了,我們看到arclist有一堆標籤名字~
再接下來就是看看模板中的標籤是否有對應的系統標籤了,如果有,就載入對應的文件,調用對應的函數,把函數返回值賦值給模板標籤對應的值。
這樣,整個模板的標籤就完成賦值了。
至於系統中那些標籤(/include/taglib/下的那些標籤解析文件)其實就是一個函數,裏面讀取數據庫數據,組織數據,輸出而已。
這節就到這裏了,主要講了分析好的模板標籤如何綁定最終數據的。其實比較簡單,因爲模板分析的時候已經得到了當前模板所使用的全部標籤,接下來只要遍歷標籤,調用不同的標籤函數,獲取函數返回數據就行了。
有些細心的朋友會發現,到這裏其實還沒有完,數據什麼的都得到了,接下來呢?是如何生成靜態文件的?
這就是下一節要講的東西啦。
附:dedecms(v5.6)系統目錄
a /* 生成HTML的目錄 */
|data /* 程序生成常用數據保存目錄 */
| |admin /* 保存系統後臺常規配置,例如作者、快速導航、來源,以文本格式存放*/
| |backupdata /* 數據庫備份存放目錄,可以在系統後臺設置處修改 */
| |cache /* 系統緩存 */
| |enums /* 聯動類別生成的緩存和js文件*/
| |js /* 欄目js調用生成的js文件 */
| |mark /* 圖片水印設置目錄 */
| |module /* 系統後臺那些模塊安裝包存放的目錄,通常文件名稱加密過 */
| |rss /* 生成RSSmap存放的文件目錄 */
| |sessions /* 系統sessions存放目錄,登陸後就會生成個session,目錄需可寫*/
| |textdata /* 文本數據,系統後臺保存爲文本數據存放目錄 */
| |tplcache /* 模板緩存目錄,這個緩存一般是那些動態頁 */
| |ziptmp /* 壓縮緩存目錄 */
|dede /* 系統後臺管理目錄 */
| |img
| |inc
| |js
| |templets /* 系統後臺的模板存放目錄 */
|images
| |js
| |swfupload
| | |images
| | |plugins
|include /* 系統核心類庫、函數存放目錄 */
| |calendar /* 日曆控件,就是日期編輯框跳出來的那個日曆框 */
| |code /* datalistcp動態分頁類的編碼語言包 */
| |data /* 系統核心設置的數據,比如詞庫默認驗證碼 */
| |dialog /* 系統對話框存放目錄,編輯器上面選擇的類似於縮略圖、插入圖片文件*
| | |img
| |FCKeditor /* 編輯器存放目錄,用的是開源編輯器FCK */
| | |editor
| | | |css
| | | | |images
| | | |dialog
| | | | |common
| | | | |fck_about
| | | | |fck_codes
| | | | |fck_flash
| | | | |fck_image
| | | | |fck_link
| | | |dtd
| | | |images
| | | | |smiley
| | | |js
| | | |lang
| | | |skins
| | | | |images
| |inc /* 這裏存放一些用才引入的比較長的函數 */
| |taglib /* 就是那些用在模板中的標籤存放的目錄了 */
| | |channel /* 解析一些特殊字段的擴展函數庫 */
| | |help /* 基本的標籤說明 */
| |tpllib /* 動態模板標籤,一般用在動態調用頁面上面的標籤 */
|install /* 安裝目錄 */
| |images
| |templates
|member /* 會員中心目錄 */
| |images
| | |pay
| |inc /* 會員中心*/
| |js
| |paycenter /* 支付接口配置 */
| | |alipay
| | |cbpayment
| | |nps
| | |tenpay
| | |yeepay
| |space /* 會員中心的空間模板 */
| | |coffee
| | | |images
| | |company
| | | |images
| | |flower
| | | |images
| | |gray
| | | |images
| | |lxblog
| | | |images
| | |lxbrown
| | | |images
| | |lxvista
| | | |images
| | |person
| | | |blue
| | | |common
| | | | |css
| | | | |images
| | | |images
| | |pwblue
| | | |images
| | |pwglight
| | | |images
| | |pwlake
| | | |images
| | |pwpink
| | | |images
| |templets
|plus /* 系統插件存放目錄 */
| |guestbook /* 留言板插件*/
| | |images
| |img
| | |face
| |paycenter
| | |alipay
| | |cbpayment
| | |nps
| | |tenpay
| | |yeepay
| |task
|special /* 專題存放目錄 */
|templets /* 織夢模板存放目錄 */
| |default /* 系統默認模板目錄 */
| |images
| | |mood
| | |photo
| |js
| |style /* 默認模板存放的CSS樣式 */
| |plus /* 插件頁面的模板文件存放目錄 */
| |system /* 系統核心底層模板文件夾 */
| |wap /* 那個wap模塊的樣式目錄了 */
|uploads /* 文件上傳存放目錄 */
| |allimg /* 圖片 */
| |flink /* 友情鏈接圖片 */
| |litimg /* 縮略圖*/
| |media /* 多媒體存放目錄 */
| |soft /* 軟件*/
| |userup /* 用戶文件存放,例如頭像 */