Orchardcms 高级果园主题-对象模型vs Placement.info?

Orchardcms 高级果园主题-对象模型vs Placement.info?,orchardcms,theming,Orchardcms,Theming,我的任务是将一个设计繁重、相当高级的网站HTML模板转换成一个Orchard主题,我正在努力寻找实现某些事情的最佳方法。这个主题是建立在bootstrap的基础上的,是一个现代的响应式HTML模板,就像你在ThemeForest或其他网站上看到的那样。该网站将有许多内容类型(工作人员、投资组合项目、合作伙伴等),并需要许多模板。内容类型将在自定义内容部分中包含大量字段(多达十几个) 根据我所读到的内容,在Orchard中制作主题的正确方法是使用placement.info与替换、包装等结合使用。

我的任务是将一个设计繁重、相当高级的网站HTML模板转换成一个Orchard主题,我正在努力寻找实现某些事情的最佳方法。这个主题是建立在bootstrap的基础上的,是一个现代的响应式HTML模板,就像你在ThemeForest或其他网站上看到的那样。该网站将有许多内容类型(工作人员、投资组合项目、合作伙伴等),并需要许多模板。内容类型将在自定义内容部分中包含大量字段(多达十几个)

根据我所读到的内容,在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>
  • 这种方法的好处是,我可以在几个视图中应用所有值,而且可读性更强。显然,问题在于,如果删除了任何特性或零件,模板就会断裂

    果园里有什么办法可以两全其美呢?我不能为每个字段都有一个包装器或模板-这可能会在最后导致数百个字段。我还可能需要在多个位置以不同的视图显示内容类型-然后每个字段将需要一组全新的包装器或每个投影的替代品

    请让我知道我是否遗漏了任何东西,或者除了手动遍历我需要的属性之外,是否还有更好的方法来执行此操作。我需要一种能够轻松地将属性插入非常特定的html的方法

    我最后的想法是使用对象模型为自定义内容类型使用非常特定的模板,但仍然提供良好的通用模板/placement.info文件,以便通用Orchard内容具有灵活性,但自定义内容类型必须保持现状


    附带考虑-我想另一种选择是将任何直接访问属性的代码包装在try-catch块或某种错误处理程序帮助程序中,但这似乎不是“最佳实践”。

    我认为本文中的技术正是您想要的:

    嗨,Bertrand,感谢您的回复!这篇文章很有帮助,但您能否详细说明将内容部分注入区域而不是直接从模型访问内容部分/属性的优点?是因为您使用Placement.Info,如果有人删除该零件,它不会损坏吗?如果在区域Orchard内使用Content Part模板直接访问零件的属性,那么如果Content manager删除属性,这种情况还会发生吗?我希望这些问题有意义,感谢您的时间。如果您愿意,您可以直接访问这些属性,这篇文章实际上也可以这样做。这篇文章指出,这项技术可以让您充分利用两者。