七、制作主题(二) Anatomy of a theme

Where Themes Live

主题必须放在网站/Themes/目录下。

 

TheThemeMachine

TheThemeMachine是Orchard的内建主题,你能通过这个主题来学习Orhcard的主题。

 

TheThemeMachine被设计成整洁的、现代的并作为开发新主题的起始点。

 

Anatomy of a Theme

Manifest

每个主题都必须有一个manifest,manifest是一个叫Theme.txt的文本文件,位于主题目录中,

Name: The Theme Machine
Author: jowall, mibach, loudej, heskew
Description: Orchard Theme Machine is a flexible multi-zone theme that provides a solid foundation to build your site. It features 20 collapsible widget zones and is flexible enough to cover a wide range of layouts.
Version: 0.1
Tags: Awesome
Website: http://orchardproject.net
Zones: Header, Navigation, Featured, BeforeMain, AsideFirst, Messages, BeforeContent, Content, AfterContent, AsideSecond, AfterMain, TripelFirst, TripelSecond, TripelThird, FooterQuadFirst, FooterQuadSecond, FooterQuadThird, FooterQuadFourth, Footer

 

文件给出了主题一个友好的名字、描述、作者、标签等,Zones提供zone名称列表,可通过主题的布局和模板用于widgets。Zones是能加入到任何模板或布局的内容的容器。许多UI元素能注入到Zones,但最常见的是widgets。不是所有的zones都需要暴露在manifest中,仅仅是打算包含widget的zone。

 

这个图显示了19个zone,通常是一个网站需要的。

 

Icon or Thumbnail

Theme.png应该在主题中,图片最小应该是400*400像素,它会在主题库和管理面板中显示,通常使用主题显示的页面来作为缩略图。

 

Widget Zones Preview Image

随意地,主题能加入widget zones的预览图片,这个图片应该放在主题根目录命名为ThemeZonePreview.png,这个图片要400像素宽并显示不同的zone和zone的名称。

 

Static Resources

主题通常包含一些静态资源,像CSS,Javascritp,Images等,这个文件应放在下面文件夹中:

  • CSS 应放在主题的Styles文件夹中。
  • JavaScript 应该放在Scripts文件夹中,放入这个文件夹的所有脚本应该是自定义的并仅与你的主题关联,不是打算重用脚本。一些要重用的脚本应该包含在各个模块中,请查看Jquery的例子。
  • Images 应该放在\Content\Images文件夹中,如果主题包含少数图片,可以将它们放在一起,如果图片很多,我们推荐把它们分别放入不同的子文件夹中。

注意:要想文件能使用,包含静态文件的文件夹都应该包含一个web.config的文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <httpHandlers>
      <!-- iis6 - for any request in this location,
           return via managed static file handler -->
      <add path="*" verb="*" type="System.Web.StaticFileHandler" />
    </httpHandlers>
  </system.web>
  <system.webServer>
    <handlers accessPolicy="Script,Read">
      <!-- iis7 - for any request to a file exists on disk,
           return it via native http module.
           accessPolicy 'Script' is to allow for a managed 404 page. -->
      <add name="StaticFile" path="*" verb="*" modules="StaticFileModule"
           preCondition="integratedMode" resourceType="File"
           requireAccess="Read" />
    </handlers>
  </system.webServer>
</configuration>

 

Document

Document.cshtml一般在主题中看不到,因为很少需要重写它。多数主题仅在SafeMode主题中能用到这个文件的版本,在/Views下面。Document.cshtml文件负责body以外的html元素,意思就是它定义doctype、html、head元素,一些脚本和CSS链接。

 

Layouts

Layout是body元素内最外面的shape。例如:通常你定义的主widget zone。

一个主题能包含不限数量的layout文件,尽管目前只支持一个,包含在TheThemeMachine主题中叫Layout.cshtml。例如:一个主题能添加专门的layouts,像是Layout-Blog.cshtml或Layout-homepage.cshtml用于替换默认的blog或homepage,提供那些layout shape的扩展。注意这个layout的名字是Layout-{layout name}.cshtml,每个layout能有不同的zones,组织成不同样式。

 

Shape Templates

Orchard中,一个网页面呈现为html之前,它构建了shapes树。shapes是呈现给页面的灵活的对象。示例有:zones,menus,menu items,widgets.

每个shape能用一个能被主题重写的模板渲染,模板与shape有同样的名称。例如:如果 Menu.cshtml存在,它用于渲染menu shape。

TheThemeMachine主题有两个shape模板,BadgeOfHonor and Branding,Layout.cshtml中建立的并使用下面代码注入到Header和Footer zones中:

// Site name and link to the home page
WorkContext.Layout.Header.Add(New.Branding(), "5");
// Powered by Orchard
WorkContext.Layout.Footer.Add(New.BadgeOfHonor(), "5");

 

注意:模板用两种方式中的一种渲染shapes,另外模板能用代码定义渲染,定义一个有Shape特性的方法。请看CoreShapes.cs例子,通常在模块中完成,但主题同样也能做。

 

Item Templates

主题能重写  /Views/Items文件夹中的模板如何渲染content items,模板的名字应该叫Content-{content type name}.cshtml 或 Content-{content type name}.{display type}.cshtml。例如:重写blog posts如何被渲染的模板 应该是/Views/Items/Content-BlogPost.cshtml,重写blog posts summary如何被渲染的模板 应该是/Views/Items/Content-BlogPost.Summary.cshtml。

 

Part Templates

主题能重写content parts的渲染。这个公约与content item templates类似,part的模板必须放在/Views/Parts文件夹中,例如:能创建\Views\Parts\Comments.cshtml渲染comments

 

Field Templates

Field的渲染也能被重写,尽管不是在field实例层,换句话说,你能重写text field看起来像什么,但不是具体的text field看起来像什么。要重写field 模板,需要在/Views/Fields中创建{field type name}.cshtml or {field type name}.{display type}.cshtml文件,例如:text fields的渲染能被\Views\Fields\Common.Text.cshtml模板重写。

 

Alternates

alternates 是一组关联shapes的templates或layout文件,使用能用主题控制不同内容类型如何被渲染。例如:你能使用alternates为主页应用一个layout文件但为subpages应用另一个layout文件,或者,你能使用alternates 以一种方式渲染page中的元素但blog post中的元素用另一种方式渲染。

Widget Overrides

widget也能在\Views named widget-{widget type}中创建一个模板来重写,例如:你能重写HTML widget的渲染并添加一个红色框包围这个内容,在Views文件夹中创建widget-htmlwidget.cshtml文件

<div style="border:1px red solid">
@Display(Model.Content)
<div>

 

 

Placement Files

主题能通过包含placement.info文件修改shapes渲染的位置,placement.info是一个xml文件:

<Placement>
    <!-- widgets -->
    <Place Parts_Blogs_BlogArchives="Content:before"/>
    <Place Parts_Blogs_RecentBlogPosts="Content:after"/>
    <!-- default positioning -->
    <Match ContentType="Blog">
        <Match DisplayType="Summary">
            <Place Parts_Blogs_Blog_Description="Content:before"
                   Parts_Blogs_Blog_BlogPostCount="Meta:3"/>
        </Match>
    </Match>
</Placement>

 

Markup

每个文件中的markup强制使用你选择的视图引擎。Orchard默认是Razor(.cshtml)引擎

模板中,Model 对象代表当前shape的渲染,意思是如果你使用有一个Message属性的message shape工作,你能使用@Model.Message显示Message属性。

重点是Orchard提供了Display来渲染shape,例如:如果你查看layout.cshtml文件,你能看到zones是如何被渲染的,调用  @Display(Model.Content)

最后,你也能看到一些模板中的调用:@Html.RegisterScript("mystyle.css") or @Html.RegisterScript("myscript.js"),这个调用是必要的,因为scripts、stylesheets是共享的资源。如果多个模块或同样的widget实例请求同样的文件,link或script元素就不会被渲染两次。

 

Themes with Code

多数主题仅由css,template,images等组成,没有代码除了模板中的一些简单的代码。更高级的主题,你可能想在代码中提供设置、创建自宝义shapes、或重写shapes。它可能像构建一个模块并包含到一个.csproj文件中,描述如何编译它包含的代码。

posted @ 2012-03-23 10:18  commanderss  阅读(529)  评论(0编辑  收藏  举报