我的任务是将一个设计繁重,相当高级的网站HTML模板转换为Orchard主题,我正在努力寻找完成某些事情的最佳方法。该主题基于bootstrap构建,是一个现代的响应式HTML模板,就像你可以在ThemeForest上找到的那样。该网站将有许多内容类型(工作人员,项目组合项目,合作伙伴等),并将需要许多模板。内容类型将在自定义内容部分中包含大量字段(超过12个)。
基于我所读到的,在Orchard中进行主题化的正确方法是将placement.info与替换,包装等结合使用。如果添加/删除部件或属性,这将优雅地处理。但是,这种技术很快变得势不可挡,因为我必须为每个内容类型以及该内容类型的每种显示类型声明placement.info中每个字段/部分的名称和顺序。然后,每个内容类型的每个字段都需要包含在非常特定的html中。这会产生一个问题,因为单个页面可能会分成几十个视图,HTML标记在一个视图中打开而在另一个视图中关闭。
我发现最好的解决方法是基本上忽略placement.info文件并仅通过遍历对象模型来构建模板。所以基本上,对于投资组合页面,我会复制我拥有的模板HTML,然后用模型中的值替换文本值。这可能类似于:
<li class="@Display(Model.ContentItem.PortfolioPart.PortfolioCore.Value.ToLower())">
<a href="@Url.ItemDisplayUrl(contentItem)" >
@foreach (var media in Model.ContentItem.PortfolioPart.PortfolioImage.MediaParts)
{
<img src="@Display(media.MediaUrl)" />
}
<span class="type">@Display(Model.ContentItem.PortfolioPart.PortfolioCoreArea.Value)</span>
<span class="portfolio-item-content">
<span class="header">@Display(Model.ContentItem.TitlePart.Title)</span>
<span class="body">
<p>
@Display(Model.ContentItem.PortfolioPart.PortfolioTagline.Value)
</p>
</span>
</span>
</a>
</li>
这种方法的好处是我可以在几个视图中应用所有值,并且它更具可读性。显然,问题在于如果删除任何属性或部件,模板就会中断。
Orchard有没有办法让两全其美?我不能为每个字段都有一个包装器或模板 - 到最后可能会有数百个字段。我还可能需要在具有不同视图的多个位置显示内容类型 - 每个字段将需要一组全新的包装或替换每个投影。
如果我遗漏了任何东西,或者除了手动遍历我需要的属性之外还有更好的方法,请告诉我。我需要一种方法能够轻松地将属性插入到非常具体的html中。
我最后的想法是使用对象模型为自定义内容类型使用非常特定的模板,但仍提供良好的通用模板/ placement.info文件,以便一般的Orchard内容灵活,但自定义内容类型必须保持原样。
一边想 - 我想另一种选择是将任何直接访问属性的代码包装在try catch块或某种错误处理程序助手中,但这似乎不是“最佳实践”。
答案 0 :(得分:0)