引言:最近學習Orchard,被它的各種機制徹底迷上了,有點相見恨晚的感覺,學習起來完全停不下來,工作10多年沒寫過1篇博客的我都忍不住開通博客,記錄下自己使用Orchard做項目的點點滴滴。本系列連載將記錄我在使用Orchard1.9.2制作一個真實項目的全過程,會更側重予實踐,Orchard的原理可以查看官方資料。
第一部分 入門篇
1.1 Orchard簡介
Orchard是有微軟公司創建的,基於ASP.NET MVC技術的免費內容管理系統。
具有以下特點:
- 可用於建設博客、新聞門戶、企業門戶、行業門戶等各種網站
- 簡單易用的后台管理界面
- 性能穩定,功能齊全。
- 熱拔插模塊化架構提供超強擴展性
- BSD協議授權,可用於商業閉源項目
1.2 Orchard基本概念
CMS是內容管理系統的縮寫, ‘C’指的是內容, 內容是網站中的任何信息,例如一篇blog、一個回復,甚至一個導航菜單、公司logo等。如果有權限,我們可以在系統后台進行網站和內容的管理,這就是’M'。而 ‘S’ 是系統,這是個比較模糊的概念。
orchard並沒有提供太多的現成業務功能,所以你在其它CMS輕易的找到諸如廣告酷炫插件,但是發現在orchard中很難找到,
Orchard是由微軟於2010始啟動,使用最新.NET技術棧實現的免費開源內容管理系統。項目開發人員多數來自ASP.NET團隊,是繼Petshop,Oxite之后的重磅開源項目!
它整合了上百個開源項目,如autofac,nhibernate等,它擁有非常復雜的模塊機制,可以動態編譯模塊,因此只需將代碼發布即可運行。
同時在CMS系統架構上,它抽象了內容類型(ContentTypes),Orchard認為一切內容皆由ContentPart與ContentField構成,你可以自由的設計內容類型,這是它相比其它CMS強大的原因之一!
在擁有了極靈活的內容管理機制后,Orchard也擁有極復雜的渲染機制,首先它采用了類似Photoshop作圖方法的圖層思想,任何Url都對應一條Content或者Projection,同時也將滿足Layer層級規則的層“疊加“,最終輸出的視圖模型(ViewModel)將是一個多層結構的,且每層都擁有多個Zone的數據結構。
ps:看起來就像一本書,一頁紙就是一個Layer,每頁紙上有N個Zone,所有紙的Zone都是固定的,在theme.txt里面定義好的,每個Zone里面擁有N個Widget。
1.2.1 ContentType
ContentType:內容類型。Orchard 通過定義內容類型來定義網頁上一些可重用的界面元素。例如可以定義一個叫 BannerWidget的內容類型來顯示前台首頁的滾動廣告,也可以定義一個叫CrawlerArticle的類型來專門存放和展示通過網絡爬蟲采集來的文稿內容。內容類型定義內容包含的屬性,以及屬性值的類型。內容類型還可以任意組合變成一個新的類型。可以將內容類型理解為用戶自定義可重用控件。
內容類型由一個或多個ContentPart組成(內容部件)。便於更好的理解下面列出來Orchard部分自帶的內容類型並加以說明。
MenuWidget:前台導航部件,用於在前台首頁顯示導航欄。可以通過在模版(模版編輯在后面的章節中會講解)中重寫Menu.cshtml來定義該內容類型顯示的樣式。下圖就是通過重寫了Menu.cshtml模版頁面來重新定義導航欄顯示的樣式。
MenuWidget在Orchard中被定義成了Widget(掛件),它是Orchard的一種特殊的內容類型,通常用於展示固定在每個頁面,或者特定頁面的固定位置的內容類型。MenuWidget又由Common、Identity、Widget等ContentPart組成。
Orchard還包含ContentMenuItem、BlogPost、BlogArchives、Blog等內容類型將在后面講解。
1.2.2 ContentItem
ContentItem:內容項,內容類型的實例。內容項指一個單獨的內容,如文稿、Blog、頁面等。內容類型是類,內容向是內容的實例。
1.2.3 ContentPart
ContentPart:內容部件。內容部件是內容類型的小一級的內容類型,一個內容類型可以由一個或者多個ContentPart組成。Orchard每個ContentType都對應一個與它同名的ContentPart。
BodyPart、TitlePart、CommonPart等都是Orchard預先定義的ContentPart。
1.2.4 ContentFiled
ContentFiled:內容字段。即內容的具體屬性。內容字段指定了內容某個屬性的類型和值。主要用於擴展字段。ContentPart由一個或者多個ContentFiled組成。
Orchard預先定義的ContentFiled有
TextField:提供字符類型的字段
NumericField:提供數值類型的字段
EnumerationField:提供枚舉型字段
BooleanField:提供Boolean字段
MediaLibraryPickerField: 提供圖片、視頻、文件等路徑信息的存儲,通過使用該字段,在編輯該字段值時候,還提供了從資源庫中選擇媒體資源的功能。
1.2.5 Module
Orchard通過Module來進行功能擴展,可以根據自己的需求來自定義Module,也可以從Orchard的Module的展示廳里面下載安裝Module擴展功能。Orchard本身也是由一個個Module組成的。如下表:
Orchard.Users:提供用戶管理
Orchard.Themes:提供主題的管理
Orchard.Taxonomies:提供多租戶管理(即多站點管理)
Orchard.MediaLibrary:提供文件管理上傳下載管理,如圖片文件,Word文件的。
Orchard.Comments:提供評論管理。
1.2.8 Theme
Orchard 提供主題管理,即可以為前台頁面提供界面主題。
1.2.9 Layout
Layout布局,類似MVC的視圖。一條Url就是一個布局。
1.2.10 Zone
Orchard將每個Layout都分為了Header, Navigation, Featured, BeforeMain, AsideFirst, Messages, BeforeContent, Content, AfterContent, AsideSecond, AfterMain, TripelFirst, TripelSecond, TripelThird, FooterQuadFirst, FooterQuadSecond, FooterQuadThird, FooterQuadFourth, Footer等區域。如下圖:
用戶可以根據自身需求定義使用的區域。
1.2.11 Widget
Widget即頁面掛件,通常指固定顯示在某個位置的內容部件。
1.2 Orchard工作流程
當有一個request請求需要顯示一個內容的時候。系統首先是根據Route規則找到該請求對應的Controller中對應的action。然后在此action中通過IContentManager接口取獲取內容。在用IContentManager獲取內容的時候,Orchard框架會自動通過相關內容部件處理器所提供的數據存儲Filter來獲取相關部件的數據。接下來通過BuildDisplay構建一個需要顯示到視圖上的動態類Model,組成內容的各個部件都作為這個動態類的屬性。最后Orchard視圖引擎根據各部件驅動器所提供的顯示方法,找到對應的顯示模板,最終組合成一個UI呈現給用戶。呈現編輯頁面和提交編輯數據的原理大致相同。內容部件工作示意圖如下:
圖片擇至:http://www.cnblogs.com/esshs/archive/2011/06/13/2079937.html