簡單回顧一下,前面我們首頁動態檔案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 /* 使用者檔案存放,例如頭像   */