前面看了关于显示不同页面的文章,就找了下Orchard关于Alternates的文档看了下,下面我进行了翻译,需要的可以看看。
自己理解的是,根据命名规范,创建了显示页面,不用通过Driver和placement.info的设置就可以自动匹配到对应的页面。不知道是不是这样的,有时间会进行验证。
下面是我的翻译:
候补
候补是为主题在特定情况下自定义渲染形状而实现的可选的变化的形状。利用候补,你可以重写呈现内容的模板,基于内容的类型(或其他特征)。例如,你可以使用候补将一个布局文件应用于首页,另一个布局文件应用于子页面。后者你可以使用候补通过不同的方式分别渲染在页面和博客中的标签。当你有不同的内容类型并且你想自定义不同类型的显示时,候补是非常有用的。
框架使用命名规范来决定是否使用候补模板来渲染内容。命名规范可以使您添加的模板文件自动应用,而不需要修改任何代码。
候补命名规范
候补形状使用基本形状的名字后面跟双下划线(__)和特定于候补形状的结束符来命名。例如,Parts_Tags_ShowTags形状可以有Parts_Tags_ShowTags__BlogPost和Parts_Tags_ShowTags__Page名字的候补。候补名称中双下划线后的部分反映使用的形状,如当前的内容类型。(关于怎么命名形状的更多信息,参见访问和呈现形状)
映射模板文件到候补
要创建一个可以映射到相应形状的模板文件,你必须按下列命名规范命名模板:
• 形状名称中的下划线(_)在模板名称中转换为点(.)或反斜杠()。反斜杠表示模板在子文件夹。
• 形状名称中的双下划线(_)转换为连字符(-)。
• 形状名称中任何显示类型的值,在模板名称的结尾点(.)后面加上类型名称,如Content-BlogPost.Summary。
所有候补模板必须在Views文件夹下。Views文件夹可以位于主题或模块中。下表显示不同类型对应的Views下的子文件夹。
Shape type Template Folder
Content item Views\Items
Parts Views\Parts
Fields Views\Fields
EditorTemplate Views\EditorTemplates[template type folder] (例如Part的编辑模板位于Views\EditorTemplates\Parts.)
All other Views
例如,为了创建Tags Part候补模板,你可以在MyTheme\Vies\Parts文件夹下添加一个模板文件。然而,因为下划线可以转换为点(.)或反斜杠(),你也可以在Views文件加下创建一个模板文件,在名字前添加Parts.的前缀。Views\Parts\Tags.ShowTags-BlogPost.cshtml 或者 Views\Parts.Tags.ShowTags-BlogPost.cshtml 模板文件将映射到名字为 Parts_Tags_ShowTags__BlogPost的形状。
如果Orchard框架无法找到具有期望名称的候补模板,默认模板将用于这些形状。例如,如果你没有为显示标签创建候补,将使用标签的默认模板(位于Views\Parts\Tags.ShowTags.cshtml)。
Orchard框架自动创建了许多候补,你可以在你的系统中使用。尽管如此,你也可以为这些候补形状创建模板。创建候补的模式如下所示,在括号中匹配模板的实例。
对于Content形状:
• Content__[DisplayType]. (示例模板: Content.Summary)
• Content__[ContentType]. (示例模板: Content-BlogPost)
• Content__[Id]. (示例模板: Content-42)
• Content[DisplayType]_[ContentType]. (示例模板: Content-BlogPost.Summary)
• Content[DisplayType]_[Id]. (示例模板: Content-42.Summary)
对于Zone形状:
• Zone__[ZoneName]. (示例模板: Zone-SideBar)
对于Navigation形状:
• MenuItemLink__[MenuName]. (示例模板: MenuItemLink-main-menu)
• MenuItemLink__[ContentType]. (示例模板:MenuItemLink-ContentMenuItem,MenuItemLink-HtmlMenuItem, MenuItemLink-Blog)
对于menu 和 menu item 形状:
• Menu__[MenuName]. (示例模板: Menu-main)
• MenuItem__[MenuName]. (示例模板: MenuItem-main)
对于local menu 和 local menu item 形状:
• LocalMenu__[MenuName]. (示例模板: LocalMenu-main)
• LocalMenuItem__[MenuName]. (示例模板: LocalMenuItem-main)
对于 styles 和 resources:
• Style__[FileName]
• Resource__[FileName]
对于 widget 形状:
• Widget__[ZoneName]. (示例模板: Widget-SideBar)
• Widget__[ContentType]. (示例模板: Widget-BlogArchive)
对于 fields:
• [ShapeType__FieldName]. (示例模板: Fields\Common.Text-Teaser)
• [ShapeType__PartName]. (示例模板: Fields\Common.Text-TeaserPart)
• [ShapeType][ContentType][PartName]. (示例模板: Fields\Common.Text-Blog-TeaserPart)
• [ShapeType][PartName][FieldName]. (示例模板: Fields\Common.Text-TeaserPart-Teaser)
• [ShapeType][ContentType][FieldName]. (示例模板: Fields\Common.Text-Blog-Teaser)
• [ShapeType][ContentType][PartName]__[FieldName]. (示例模板:Fields\Common.Text-Blog-TeaserPart-Teaser)
对于 content parts:
• [ShapeType]__[Id]. (示例模板: Parts\Common.Metadata-42)
• [ShapeType]__[ContentType]. (示例模板: Parts\Common.Metadata-BlogPost)
你可以使用Shape Tracing 模块通过Shape Tracing界面创建候补模板. 更多信息,参见Customizing Orchard using Designer Helper Tools.
URL和部件候补
URL Alternates模块允许你为特定网页创建候补, Widget Alternates允许为确定的部件在特定区域附加候补。为了使用这些功能,必须启用URL Alternates和Widget Alternates模块。启用之后,基于网页和区域的候补形状将被创建。这些网页候补被结合到上面定义的候补模式。
例如,网址/my-blog/post-1对MenuItem对象有下列可用候补:
MenuItem-main
MenuItem-main-url-my-blog
MenuItem-main-url-my-blog-post-1
对于主页,下列候补可用:
MenuItem-main-url-homepage
使用本模块,你可以为布局形状添加特定网页的候补,比如Layout-url-homepage。为你的网站主页添加了一个特定布局。
在Themes/ThemeName/Views文件夹下创建Layout-url-About.cshtml,当访问/About页面时将会被使用。
注: 如果变化很小,也许对区域使用网址候补命名更为合适。
你可以通过下载Orchard库中的Designer Tools模块来启用URL Alternates: Orchard Designer Tools
同样widget alternates添加可以用来改变内容部分的渲染的模板名称,他们渲染特定类型的部件或特定区域的一部分。Shape Tracing (Orchard Designer Tools模块的另一个功能)是一个发现页面上哪个形状候补模板可用的好方法。
这是部件模板候补命名的例子:
Parts.Common.Body-HtmlWidget-TripelSecond
Parts.Common.Body-TripelSecond
明确指定候补模板
除了使用自动生成的候补,你可以手动指定一个候补。在placement.info文件中,你可以指定对于一个内容类型哪个候补可用。例如,为了对博客标签渲染指定一个不同的模板(定义为Parts_Tags_ShowTags_BlogPost),你可以修改Orchard.Tags模块的placement.info文件,包含一个匹配BlogPost类型的对象。下面的例子显示修改后的文件。
<Placement>
<Place Parts_Tags_Edit="Content:7"/>
<Match ContentType="BlogPost">
<Place Parts_Tags_ShowTags="Header:after.7;Alternate=ShowTags_BlogPost"/>
</Match>
<Match DisplayType="Detail">
<Place Parts_Tags_ShowTags="Header:after.7"/>
</Match>
<Match DisplayType="Summary">
<Place Parts_Tags_ShowTags="Header:after.7"/>
</Match>
</Placement>
匹配元素的顺序非常重要,只有第一个匹配元素用来渲染项目。在这个例子中,BlogPost下面的Detail和Summary不会被用到,因为更早的元素匹配了项目。 更多信息关于placement.info,参见Understanding placement.info.
MVC视图候补
Orchard的一些模块使用常规MVC视图来渲染自定义控制的动作的结果。为了定制通过MVC控制产生的页面的外观,你需要在你的主题的Views文件夹中添加一个视图文件的版本。
例如,如果你想定制Orchard.Search模块的搜索结果页面,你需要在你的主题的下面文件夹中添加一个文件:
/Themes/{Your theme}/Views/Orchard.Search/Search/Index.cshtml
该文件将覆盖由Orchard.Search模块使用的默认视图。当决定MVC视图时,Orchard使用的视图引擎会使用如下的模式。
• ~/Themes/{Active theme}/Views/{Area}/{Controller}/{View}.cshtml
• ~/Themes/{Active theme}/Views/{Controller}/{View}.cshtml
• ~/Themes/{Active theme}/{Partial}.cshtml
• ~/Themes/{Active theme}/DisplayTemplates/{TemplateName}.cshtml
• ~/Themes/{Active theme}/EditorTemplates/{TemplateName}.cshtml
请注意,主题不支持通常在MVC中支持的任何其他规则。除非在上述列表中指定。
通过代码添加候补
除了上面介绍的方法,你可以通过代码添加候补。为了通过代码定义候补,创建一个实现了IShapeTableProvider接口的类。然后,为每一个需要形状候补的类型添加OnDisplaying的handler。你指定形状名称作为ShapeTableBuilder类中Describe方法的参数。在处理程序中,你添加当候补使用时需要的任何逻辑。下面的示例演示如何为只在首页的用户指定Content形状候补。然后演示如何为DisplayType是Summary的Parts_Tags_ShowTags形状指定候补。
using Orchard;
using Orchard.ContentManagement;
using Orchard.DisplayManagement.Descriptors;
namespace MyTheme.ShapeProviders
{
public class ExampleShapeProvider : IShapeTableProvider
{
private readonly IWorkContextAccessor _workContextAccessor;
public ExampleShapeProvider(IWorkContextAccessor workContextAccessor)
{
_workContextAccessor = workContextAccessor;
}
public void Discover(ShapeTableBuilder builder)
{
builder.Describe("Content")
.OnDisplaying(displaying =>
{
if (displaying.ShapeMetadata.DisplayType == "Detail")
{
ContentItem contentItem = displaying.Shape.ContentItem;
if (_workContextAccessor.GetContext().CurrentSite.HomePage
.EndsWith(';' + contentItem.Id.ToString())) {
displaying.ShapeMetadata.Alternates
.Add("Content__HomePage");
}
}
});
builder.Describe("Parts_Tags_ShowTags")
.OnDisplaying(displaying =>
{
if (displaying.ShapeMetadata.DisplayType == "Summary")
{
displaying.ShapeMetadata.Alternates
.Add("Tags_ShowTags_Summary");
}
});
}
}
}
文档原文地址:http://docs.orchardproject.net/Documentation/Alternates