在代碼層次上看,SinaCMS是使用C++編碼的,模板取數(shù)據(jù)的時候則使用了perl腳本。SinaCMS里面頻道、項目和模板是結(jié)合在一起的,他們?nèi)叩年P(guān)系是:
不難看出,SinaCMS具有極其強大的靈活性。因為它的數(shù)據(jù)庫結(jié)構(gòu)是項目建立以后構(gòu)建模板的時候才確定的。各個頻道,例如資訊頻道、財經(jīng)頻道和汽車頻道,可以擁有完全不同的數(shù)據(jù)庫結(jié)構(gòu),不同頻道的特殊需求也可以完全定制。另外可以看出SinaCMS里面的模板是最主要的模型,承擔 了確定數(shù)據(jù)表結(jié)構(gòu)、文章發(fā)布和管理以及配置頻道參數(shù)等等功能。
我們來看CMS系統(tǒng)中常見的新聞頁,頻道首頁和列表頁在SinaCMS中是怎么實現(xiàn)的。
編輯上文章時,先找到該頻道的新聞頁,然后在下面錄入文章,錄入完畢后點擊發(fā)布,系統(tǒng)會根據(jù)模板的內(nèi)容去獲取相關(guān)的字段內(nèi)容,根據(jù)模板的屬性最后發(fā) 布成相應(yīng)的靜態(tài)文件,其間如果和其他模板有相關(guān)關(guān)系(在新聞頁模板域中定義Application::PostInPage),則會去觸發(fā)相應(yīng)的模板(例 如首頁和列表頁)更新。
在首頁模板的區(qū)塊中,可以分為動態(tài)和靜態(tài)兩種。對于需要經(jīng)常更新的靜態(tài)區(qū)塊,可以獨立出來做成一個模板,靜態(tài)區(qū)塊就相當于該模板下的一篇(有且僅有 一篇)文章,當然也可以在首頁中新建一個Form::TextField的模板域。動態(tài)區(qū)塊例如動態(tài)新聞列表,則可以在首頁中新建一個 Application::SQLResult的模板域,通過執(zhí)行perl腳本獲取內(nèi)容填充,然后在首頁模板內(nèi)容引用該模板域,當然同樣也可以新建一個只 包含一個Application::SQLResult域的模板。
對于列表頁,首先列表頁的分頁值可以存儲在列表頁的模板域中,也可以保存在某個模板中。分頁在處理時,會通過perl腳本來執(zhí)行分頁算法。最終所有列表頁都是列表頁模板下的一個文檔集。
在一個項目中,為了提高發(fā)布效率,還會存在若干的臨時存儲表和歸檔表(其實就是一些模板啦)。例如在首頁的動態(tài)新聞列表,就有可能建一個臨時存儲數(shù) 據(jù)的模板,這時如果頻繁更新首頁或者含有動態(tài)新聞列表的模板時,無疑將減輕數(shù)據(jù)庫的壓力。新聞單頁的模板在處理時可以就保存最近一個月內(nèi)的文章,尤其在文 章數(shù)據(jù)增長較快的頻道,這時就很有必要。那么以前的文章就需要轉(zhuǎn)儲到一個歸檔表中,作為查詢和偶爾更新某篇文章使用。
SinaCMS中的頻道路徑path(例如資訊>大陸>正文)是通過模板處理的,在模板的模板域中會用perl來處理相關(guān)的邏輯。子頻道和專題也是通過模板來實現(xiàn)的,它會通過新增一個模板來建立子頻道和專題之間的關(guān)系。
至此,我們可以了解到SinaCMS中使用了非常多的冗余字段來存儲本來需要多表聯(lián)合查詢的數(shù)據(jù),這無疑提高了文章的發(fā)布效率。
在其他的CMS中,模板只是獨立概念中的一個,而在SinaCMS中,萬事萬物皆模板。