織夢(mèng)、帝國及PHPCMS對(duì)比(5):標(biāo)簽解析方式分析
來源:易賢網(wǎng) 閱讀:764 次 日期:2014-09-04 16:53:57
溫馨提示:易賢網(wǎng)小編為您整理了“織夢(mèng)、帝國及PHPCMS對(duì)比(5):標(biāo)簽解析方式分析”,方便廣大網(wǎng)友查閱!

作為CMS,最需要做到地是把程序和數(shù)據(jù)展示分離出來,讓用戶不需要了解太多程序的程序即可很方便的使用來搭建合種個(gè)性化站點(diǎn),而標(biāo)簽的靈活性,很大程度上決定了CMS的好用與不好用,而標(biāo)簽的好用不好用,除了處決于標(biāo)簽本身在細(xì)節(jié)上做的細(xì)致程度(如詳細(xì)的幫助文檔、簡單的標(biāo)簽生成方式等)決定外,整個(gè)標(biāo)簽體系的設(shè)計(jì)思路更起到?jīng)Q定作用。

本文中落葉對(duì)PHPCMS、DEDECMS及帝國CMS的標(biāo)簽的設(shè)計(jì)思路與解析方式作一些簡要的對(duì)比分析。

現(xiàn)在主流的PHP程序?qū)崿F(xiàn)數(shù)據(jù)處理與數(shù)據(jù)展示的分離,都會(huì)使用第三方的或者自己開發(fā)的模板引擎,一般的模板引擎中除了支持特定格式的數(shù)據(jù)變量標(biāo)簽展示外,還支持?jǐn)?shù)組循環(huán)、邏輯判斷、函數(shù)處理、文件包含、PHP原生語法等。

一般的模板引擎的處理思路時(shí)各種以HTML文本的方式存儲(chǔ)(有的是.html的擴(kuò)展名,有的是.tpl的擴(kuò)展名),然后模板引擎會(huì)對(duì)模板中的標(biāo)簽或代碼進(jìn)行編譯預(yù)處理成PHP文件緩存到特定目錄,處理成的PHP文件里面不再是標(biāo)簽格式,而是標(biāo)簽被處理后可直接執(zhí)行的對(duì)應(yīng)的PHP語句塊。然后在PHP 控制文件中處理好數(shù)據(jù)后,使用模板調(diào)用函數(shù)調(diào)用編譯好的PHP文件形式的緩存模板(當(dāng)然,過程中會(huì)有判斷,如果緩存不存在,則直接從原模板文件編譯一次生成緩存后調(diào)用),直接整合到PHP控制文件中一起執(zhí)行。

如果是生成靜態(tài),則是先處理好數(shù)據(jù)后,引用編譯好的模板文件,執(zhí)行,輸入后緩存區(qū),后面再寫入生成HTML文件。

早期的ASP類風(fēng)格的CMS設(shè)計(jì)沒有系統(tǒng)化的模板引擎,而是采用單一替換的模式,即先讀入模板文件,然后替換模板文件中標(biāo)簽,每一個(gè)標(biāo)簽都是單獨(dú)處理替換。

PHPCMS和DEDECMS中模板的處理方式為通用的模板引擎處理方式,而帝國CMS的模板處理方式為早期的ASP類風(fēng)格CMS的處理方式。

1. PHPCMS標(biāo)簽的解析方式:

PHPCMS標(biāo)簽形式主要有TAG標(biāo)簽和GET標(biāo)簽,靜態(tài)HTML模板在編譯過程中會(huì)經(jīng)過模板引擎統(tǒng)一進(jìn)行正則替換并轉(zhuǎn)化為對(duì)應(yīng)的PHP函數(shù)塊。

如:{tag_標(biāo)簽內(nèi)容列表},經(jīng)模板引擎編譯處理后:

<?php echo tag('phpcms', 'tag_content', "SELECT a.contentid,a.catid,a.typeid,a.areaid,a.title,a.style,a.thumb,a.keywords,a.description,a.userid,a.updatetime,a.inputtime,a.url FROM `phpcms_content` a, `phpcms_content_position` p WHERE a.contentid=p.contentid AND p.posid=1 AND a.status=99 ORDER BY a.contentid DESC", 0, 5, array ( 'class' => 'url', 'target' => '_blank', 'titlelen' => '35',));?>

在控制PHP文件中使用模板引用函數(shù)引用模板時(shí),該標(biāo)簽即自動(dòng)調(diào)用global.func.php文件中的tag函數(shù)執(zhí)行得到文章列表結(jié)果后輸出。

又如GET標(biāo)簽:調(diào)用最新10條文章標(biāo)題的GET標(biāo)簽

{get sql=" SELECT `title` FROM `phpcms_content` ORDER BY contentid DESC " rows="10"}

<li>{str_cut($r[title],20,’’)}</li>

{/get}

經(jīng)PHPCMS模板引擎編譯解析后的PHP代碼塊:

<?php $DATA = get("SELECT `title` FROM `phpcms_content` ORDER BY contentid DESC", 10, 0, "", "");foreach($DATA AS $n => $r) { $n++;?>

<li>

<?php echo str_cut($r['title'],20,'');?>

</li>

<?php } unset($DATA); ?>

2. DEDECMS標(biāo)簽的解析方式:

DEDECMS標(biāo)簽的解析方式和PHPCMS類,經(jīng)過DEDE模板引擎類的dedetag.class.php的編譯處理,標(biāo)簽被處理成PHP代碼塊后緩存到data目錄的tplcache目錄。

如:分頁頁碼列表標(biāo)簽{dede:pagelist listsize=‘5’ listitem=‘’/}經(jīng)DEDE模板引擎編譯解析后和模板HTML一起緩存到緩存目錄的對(duì)應(yīng)的PHP代碼塊為:

<?php

$atts = array();

$atts['tagname'] = 'pagelist';

$atts['listsize'] = '6';

echo $this->refObj->GetPageList($atts,$this->refObj,$fields);

?>

因?yàn)镈EDE CMS模板引擎也是目前通用的模板引擎編譯解析方式,所以整個(gè)流程和PHPCMS類似。

3. 帝國CMS標(biāo)簽處理方式:

據(jù)落葉的觀察,帝國CMS是沒有模板引擎這個(gè)概念的,每一個(gè)標(biāo)簽的處理都是單獨(dú)用函數(shù)來替換。前一段時(shí)間,一位朋友希望在內(nèi)容頁有多分頁的文章前面加上分頁小標(biāo)題導(dǎo)航。當(dāng)時(shí),為了實(shí)現(xiàn)這個(gè)小小的功能,落葉仔細(xì)研究了下落葉的模板標(biāo)簽解析功能,實(shí)際發(fā)現(xiàn),帝國CMS在生成靜態(tài)時(shí),是先將需要展示的數(shù)據(jù)處理好,甚至整合HTML文件然后單個(gè)替換模板中的標(biāo)簽,每個(gè)標(biāo)簽都單獨(dú)寫一個(gè)或幾個(gè)函數(shù)來處理,然后替換后生成靜態(tài)?;旧系蹏鳦MS中的標(biāo)簽替換基本是白名單替換。結(jié)果是,即使自己想在內(nèi)容頁增加一個(gè)簡單的自定義標(biāo)簽,實(shí)現(xiàn)一些小的功能,都需要修改帝國的functions.php和 t_functions.php中的核心函數(shù)文件。

舉個(gè)帝國CMS處理標(biāo)簽的簡單例子:

獲取面包屑導(dǎo)航的標(biāo)簽的處理代碼如下:

$string=str_replace('[!--newsnav--]',$url,$string);

處理標(biāo)題標(biāo)簽的代碼如下:

$string=str_replace('[!--pagetitle--]',$title,$string);

一般如果按照模板引擎編譯解析的方式,會(huì)選將所有變量性質(zhì)的標(biāo)簽直接通過定界符判斷出是標(biāo)簽,然后統(tǒng)一使用正則進(jìn)行解析,而帝國的處理方式是一個(gè)個(gè)單獨(dú)處理,所以就出現(xiàn)像上面的那樣,$string為讀取出來的模板內(nèi)容,然后一步一步逐一替換處理,典型的早期的動(dòng)易、新云等ASP類CMS的標(biāo)簽的處理方式。

不管帝國CMS這樣處理的執(zhí)行效率高不高,至少二次開發(fā)的效率是很低的,每個(gè)頁面的標(biāo)簽或者變量都要單獨(dú)去處理。如果是想在模板中增加一個(gè)自定義變量類的標(biāo)簽,在PHPCMS中只需要在模板中{$自定義變量名}這樣即可,而帝國CMS中除了在模板中添加[!—自定義變量名--](如[!--pagedes--])外,不得不在生成靜態(tài)的處理函數(shù)中增加類似上面的標(biāo)簽替換步驟,如:$string=str_replace('[!--pagedes--]',$pagedes,$string);

也許對(duì)于普通用戶而言,不論標(biāo)簽的解析方式如何,只要把標(biāo)簽做得細(xì)致,簡單好用,靈活, 就夠了,所以帝國CMS還是有比較多的忠實(shí)用戶的,很多人覺得很省心,不要考慮啥邏輯,按照說明,標(biāo)簽放上去,就基本沒問題。而對(duì)于深度用戶,尤其是有編程基礎(chǔ)的用戶,喜歡DIY或者個(gè)性需求較多的,更習(xí)慣目前主流的模板引擎的編譯解析方式,不太喜歡封裝得很好的標(biāo)簽,希望得到干凈的數(shù)據(jù),可以直接在模板中進(jìn)行邏輯處理,而標(biāo)簽除了一部分是變量外,調(diào)用數(shù)據(jù)類標(biāo)簽,實(shí)際是特定格式調(diào)用的系統(tǒng)函數(shù)。

至少落葉,偏向于喜歡PHPCMS和DEDECMS的標(biāo)簽解析方式,而對(duì)帝國CMS的標(biāo)簽處理方式比較糾結(jié)。

系列文章:

織夢(mèng)、帝國及PHPCMS對(duì)比(1):自定義模型功能分析

織夢(mèng)、帝國及PHPCMS對(duì)比(2):支持SQL調(diào)用的標(biāo)簽

織夢(mèng)、帝國及PHPCMS對(duì)比(3):自定義URL規(guī)則

織夢(mèng)、帝國及PHPCMS對(duì)比(4):碎片功能分析

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看CMS教程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
相關(guān)閱讀CMS教程

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)