【问题标题】:Best practice for accessing Sitecore Items via code通过代码访问 Sitecore 项目的最佳实践
【发布时间】:2014-07-01 15:33:57
【问题描述】:

对 Sitecore 非常陌生,想了解访问 Sitecore 项目的最佳方式。我见过几种方法:

  1. 创建页面 ID 字段并获取给定模板和文件夹的所有项目。然后对页面 ID 进行 linq 查询。

  2. 将所有页面 ID(Sitecore 项目 ID)存储在常量文件中。使用它通过 GetItem(itemID) API 查询 Sitecore。

有人可以建议什么是最佳做法。无论哪种方式,我都可以看到包含自定义页面 ID 或 Sitecore 项目 ID 的巨大常量文件。

我担心我们是否真的需要管理这个常量文件,或者是否有一种优雅的方式来查询给定页面的 CMS 内容。

谢谢。

【问题讨论】:

    标签: sitecore sitecore6


    【解决方案1】:

    方法 1 似乎有点奇怪。我真的不明白为什么在你已经有了 ID 的情况下你会先得到一个物品的集合,但也许我误解了你的意思。

    我认为结合你提到的两件事是最好的。

    常量类适用于永远存在的“地标”项目,因此 GUID 可以在代码中使用。 其中一些具有里程碑意义的项目可以是“配置项目”,其字段包含其他项目的 ID(这些字段的名称可能类似于“搜索中允许的模板”)。这种方法允许 Sitecore 用户随着网站的发展灵活地进行更改。

    如果您关心常量文件的管理,我想知道您需要通过 ID 访问多少项。 Sitecore 项目具有ParentChildren 等属性。您还可以按模板类型等查找项目。

    这种方法对我很有效。我当然不认为有更优雅的方式来获取对 Sitecore 项目的强类型引用。

    【讨论】:

    • 为什么不用 CustomItemGenerator?这是获取 Sitecore 项目引用的绝佳方式。您可以使用 web.config 中的 Home/Start 项目的设置来获取最顶层的项目。您所需要的只是在整个开发过程中强制执行的可靠站点结构。
    • 不知道这个。看起来很有趣。 marketplace.sitecore.net/en/Modules/Custom_Item_Generator.aspx
    • 是的 - 我也在回答中链接到它
    【解决方案2】:

    就个人而言,我不喜欢使用常量文件。如果您的客户或您的一位开发人员删除其中一项并创建一个新项,会发生什么? Sitecore 的基本原则之一是可以由不一定是“技术”人员的用户添加和删除项目。

    Sitecore 提供“插入选项”,以便您可以指定可以将哪些类型的项目添加到每个文件夹中,并通过角色和用户权限授予保护某些项目不被删除的能力。这在概念上意味着什么?这意味着 Sitecore 的设置使得系统架构师/开发人员可以创建一个不会被违反的结构,而内容编辑器可以在该结构中添加或删除内容。换句话说,Sitecore 旨在提供一个框架,其中项目可以更改,但每种类型的项目的位置都是预先确定的。

    因此,我建议您使用 Sitecore Marketplace 中提供的 Custom Item Generator 模块(免费)。 CIG 生成模板的 C# 类表示(模型),并将所有字段变成属性(我不想离题太远,但这是 CIG 的一个很棒的功能,尤其是在与新开发人员合作时)。您可以将自己的方法添加到 CIG 类中以获取特定类型的子级。例如,在个人资料页面是主页的直接子级的站点上,可以将以下方法添加到 CIG HomepageItem.instance.cs 文件的 HomepageItem 部分类:

    ...
    public partial class HomepageItem 
    {
        public ProfilePageItem GetProfilePage() 
        {
            //note that .IsOfType(...) is pseudo-code and not a real method, but I do 
            //   suggest that you define an extension for it
            return InnerItem.Children.FirstOrDefault(i => i.IsOfType(ProfilePageItem.TemplateId));
        }
    }
    


    确保您分配插入选项以限制可以作为子项添加到您制作的每个项目的项目类型(将它们添加到标准值而不是单个内容项)。我还建议您为内容树中使用的每个文件夹创建一个从 Common/Folder 继承的单独模板。这样您就可以在整个结构中使用 CIG,方法是:

    ...in your Globals Item's CIG class...
    public partial class GlobalsItem
    {
        public SlidesFolderItem GetSlidesFolder() 
        {
            return InnerItem.Children.FirstOrDefault(i => i.IsOfType(SlidesFolderItem.TemplateId));
        }
    }
    
    ...in your Slides Folder Item's CIG class...
    public partial class SlidesFolderItem
    {
        public IEnumerable<SlideItem> GetSlides() 
        {
            return InnerItem.Children.Where(i => i.IsOfType(SlideItem.TemplateId));
        }
    }
    

    然后您可以通过以下方式获取您的幻灯片项目:

    ...
    var slidesFolder = globals.GetSlidesFolder();
    var slides = slidesFolder != null ? slidesFolder.GetSlides() : null;
    


    请记住,每种类型的文件夹的 CIG、插入选项和模板将使您能够为您的网站创建一个坚固的结构,即使内容编辑器进行了意外更改(例如替换项目)也不会破坏。


    如果您对此有任何疑问,请告诉我。祝你好运,快乐编码! :)

    【讨论】:

    • 如果您的开发人员是负责 IA 和对象定义的同一个人,那么代码生成工具会很有用。在我的情况下,它们不是,并且尝试使用这些工具让我们一团糟。也就是说,我很感激我的情况可能不是常态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多