主题可以让Orchard用户自定义站点显示界面,度身定制他们想要的站点风格。主题还可以有针对性的对Orchard模块所提供的任何模板进行样式重写、甚至是改变图像、布局等。
主题在哪
主题位于Orchard网站根目录下的Themes文件夹中。
TheThemeMachine(默认主题)
TheThemeMachine是Orchard默认提供的主题,我们可以通过分析这个主题来了解Orchard主题的功能。和其他任何一个主题一样,它也可以在Themes文件夹中找到。
TheThemeMachine被设计成为一个简洁但是确具有前瞻性的主题,它里面几乎包含了主题的各种功能。本文就通过分析这个主题,来介绍主题的相关知识。
分析一个主题
本节介绍了主题中一些必需的和可选的元素。
清单文件(Theme.txt)
每一个主题都必需有一个清单文件来描述该主题。此文件是一个文本文件,命名为Theme.txt,在相应主题文件夹的根目录下。下面是TheThemeMachine主题的清单文件:
Name: The Theme Machine
Author: jowall, mibach, loudej, heskew
Description: Orchard Theme Machine is a flexible m….
Version: 0.1
Tags: Awesome
Website: http://orchardproject.net
Zones: Header, Navigation, Featured, BeforeMain…
文件给出了主题的名称、描述、作者、标签等信息。区域(Zones)字段则描述了该主题所有可用的区域。区域里可以添加任何内容,最常见的是widgets。并不是所有的区域都需要在这里描述,只有那些需要添加widgets的区域才需要在这里进行描述。
此图显示了19个区域,这通常已经超过了你网站所需要的布局。这些区域包括页眉(Header)页脚(Footer),它们位于页面的最上面和最下面。有一个导航区域(Navigation),这里通常是显示导航菜单的。特色区域(Featured)你可能会放一个网站Banner。BeforeMain和AfterMain在你网站主要内容区域的前后。AsideFirst和AsideSecond在你网站主要内容区域的左右。在页面的中部有一个消息区域(Messages),可用于显示消息通知。其次还有BeforeContent和AfterContent也在主内容区域前后,但是却在两侧区域之间。TripelFirst,TripelSecond,TripelThird在页面的最底部,如你想实行三列布局效果,那么就可以用它们。
Orchard作为一个内容管理系统(CMS),内容管理部分当然是其中最核心的东西。在Orchard中的任何数据都可以把它理解为内容(Content)。页面是内容、博客是内容、文章也是内容。整个网站就是由这些不同类型的内容项(Content Item)构成的。对这些不同内容的类型定义就是内容类型(Content Type)。而内容类型则是通过若干个不同的内容部件(Content Part)组成。这些内容部件都是可以跨类型重用的东西,每一个内容部件都实现了从UI层到数据库层的完整封装。正是由于Orchard这种对内容的组织,我们可以很方便的构造出一种新的类型。如:我们需要做一个产品展示页面,只需要定义一个产品类型(Product Type)。在这个产品类型中我们只用定义一个产品特有内容部件(Product Part,包含价格、品牌等信息),并添加一个路由部件(Route Part,可指定相应产品的名称和详情页地址)、一个文本部件(Body Part,可提供一个富文本输入框,用做产品信息描述)即可。此外,我们还可以添加标签部件(Tags Part),评论部件(Comments Part)等来丰富此产品类型。一旦有了这个产品类型的存在,我就可以很方便的通过后台来维护产品内容了。
Orchard中内容组织结构图示意图
Orchard中博文类型的Part分解图
由上图就可以看出一片博文其实是由多个内容部件组成的。
Orchard中一些常用的内容部件
Route Part:路由部件,可为内容提供路由支持即可通过指定Url访问相应内容。
Body Part:文本部件,可提供一个富文本编辑器的功能。
Comment Part:评论部件,可提供评论功能。
Tags Part:标签部件,可提供内容的标签定义,实现全站的标签检索功能。
Common Part:通用部件,提供所有者信息。
Publish later Part:延迟发布部件,提供内容延迟发布功能。
参考文档:
Orchard中的基本概念:http://www.orchardproject.net/docs/Basic-Orchard-Concepts.ashx
整整看了一天关于Orchard的东西,总的感觉还是一头雾水,先整理了一些关键词记录下来,便于以后深入的学习和了解。
运行机制相关的概念:
Architecture:架构。见下图:
官网介绍地址:http://www.orchardproject.net/docs/How-Orchard-works.ashx
Orchard是配置在IIS服务器上的一个Web站点,它使用了.NET4.0和ASP.Net的技术。代码是C#编写的。是基于ASP.NET MVC3的Web开发框架上编写的一个应用。它使用到了Nhibernate(OR映射工具)、Autofac(依赖注入容器)、Castle(也是一个开源框架,好像说是用到了动态代理之类的东西,目前还没明白,等清楚了再说)等成熟的框架和类库。其实还有一些其他常用的类库,如:sharpziplib(压缩、解压)、log4net(日志)等。估计是太常用了所以并没有将其列在图上。在这些成熟的框架基础上,Orchard建立了一个自己的框架Orchard Framework,主要提供一些最基本的功能,如:视图引擎(我感觉Orchard对Razor进行了重写和扩充)、内容管理、用户认证等,我们可以把它理解为Orchard所要使用的基础类库。在Orchard Framework的基础上,Orchard提供了一个网站运行最核心的功能,这些功能可以被其他模块使用。如:feeds、navigation和routable。在Orchard Code之上就是模块了(Modules),Orchard自带了一些基础的模块,如:博客。另外一些后台的功能也是作为模块提供的,比如:模块管理,页面管理等。
Shell:外壳,可以理解为Orchard站点的运行基础。包括站点设置、可使用的模块列表、主题列表等等。
Tenant:直译为租户,其实是一个逻辑站点的意思。Orchard支持在一个物理的站点上建立多个逻辑的站点。每个逻辑站点都是独立,有自己的数据,自己的主题等。所以我觉得把它翻译成站点更好些。类似DNN中Portals的概念。
皮肤相关的概念:
Theme:主题。是网站皮肤的概念。可以自由的定义显示区域,而且在Orchard中页面上的任何一部分的Html代码都是可以控的。而且可以根据多种情况,对同一个模块进行不同的样式定义。如:不同的站点,不同的请求地址等。总之是一个非常灵活的东西。
Zone:区域。是皮肤上的区块划分。用于在页面上不同的地方呈现不同数据。关于自定义区域功能,好像是动态类型在这里发挥了巨大作用。具体实现,等深入了解后在详细描述。
Layer:层。这也是一个皮肤中的概念。它相当与把平面的东西立体化了。在原有的区域的基础上增加了一个权限和特定情况的维度。即可在某一区域上面根据不同的权限显示不同的数据。如:管理员可见的,注册用户可见的,匿名用户可见的,首页可见的等等。通过层的概念就很好的解决了不同权限显示不同内容的问题。并且层还可以自由定义,具体用法和实现还需要深入学习。
功能相关的概念:
Module:模块。这个定义的范围很广,几乎所有的功能都是由模块构成的。在Orchard的划分中 ContentType、Part、Field,Widget,等都可以称做模块。但我倾向于把一个完整的功能,叫做模块。比如:Blogs模块,商城模块等。其余的内容还是按照各自的属性去划分。
Widget:小部件。可以提供多种功能的东西,如:最近博文,Html内容,登录控件等等。你可以把这些小部件,添加到页面的任意一个区域中。至于小部件还能干什么,就看我们的想象力了。
ContentType:内容类型。这个可是Orchard中非常亮丽的一个功能了。比如:一个文本输入框是一个类型,我们可以定义它在显示的时候是什么样子的、编辑的时候是什么样子的、是如何存储的。也就是说每一种类型都实现了由数据库层到显示层的完整封装。更神奇的是,我们可以利用这些现有的类型组装出一个新的类型。比如:我们可以在后台中添加几个自定义字段、再加一个Body Part(图文编辑器)、再加一个Comment Part(评论),一个新的新闻类型就诞生了。可以想象这样的开发利用率有多高。而且它居然还有一个更更神奇的地方,就是每一种类型在其他新的类型中当作Part的时候,其显示样式都是可以重新定义的。这样将会极大的提高复用的灵活性。
Part:构成类容类型的一个组成部分。它可以是评论、可以是博客,它可以是你任何想表达的业务实体。是做作为显示和处理的基本单元。是Orchard中一个很关键的组成部分。我觉得暂时可以把它理解为组件,等有了深入了解后再做详细的论述。
Field:字段。我觉得可以理解为一种轻量级的内容部件,通常是一个文本框,或者是一个可选择日期的日期输入框。叫做输入控件也许更贴切些。
编程相关的概念:
Record:记录。是实际存储到数据库中的数据。我觉得也可以称它为数据实体。
ContentPart :内容部件。是呈现到UI上的数据,我觉得也可以称它为业务实体。
Repository:数据仓库。负责数据访问的对象,我们就叫它数据访问层吧。
Handler:处理器。负责定义数据存储的方式。
Driver:驱动器。负责处理部件或字段的呈现逻辑,类似于MVC中的Controller。
Shape:外形。是一个动态类型。它负责把业务数据组装起来在View层上面显示。我们叫它视图模型也许更好一些。

