通过代码访问Sitecore项目的最佳实践

通过代码访问Sitecore项目的最佳实践,sitecore,sitecore6,Sitecore,Sitecore6,对Sitecore非常陌生,希望了解访问Sitecore项目的最佳方式。我看到了两种方法: 创建页面ID字段并获取给定模板和文件夹的所有项目。然后对页面ID执行linq查询 将所有页面ID(Sitecore项目ID)存储在常量文件中。使用此选项可以使用GetItem(itemID)API查询Sitecore 有人能建议一下最好的做法吗。无论哪种方式,我都可以看到包含自定义页面ID或Sitecore项目ID的巨大常量文件 我担心的是我们是否真的需要管理这个常量文件,或者是否有一种优雅的方式来查询给

对Sitecore非常陌生,希望了解访问Sitecore项目的最佳方式。我看到了两种方法:

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

  • 将所有页面ID(Sitecore项目ID)存储在常量文件中。使用此选项可以使用GetItem(itemID)API查询Sitecore

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

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


    谢谢。

    方法1似乎有点奇怪。我真的不明白,当你已经有了身份证时,为什么你会先得到一系列物品,但也许我误解了你的意思

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

    常量类适用于“landmark”项目,这些项目肯定会一直存在,因此GUID可以放在代码中。 其中一些地标项目可以是“配置项目”,其中包含包含其他项目ID的字段(这些字段的名称可能类似于“搜索中允许的模板”)。这种方法允许Sitecore用户在站点发展过程中灵活地进行更改

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


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

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

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

    因此,我建议您使用Sitecore Marketplace中提供的模块(免费)。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));
        }
    }
    

    请记住,每种文件夹类型的CIG、插入选项和模板都将使您能够为站点创建一个铁包袱结构,如果内容编辑器进行意外更改(如替换项目),该结构将不会中断



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

    为什么不使用自定义项生成器?这是获取Sitecore项目引用的极好方法。您可以使用web.config中的Home/Start项目设置来获取最顶端的项目。你所需要的是一个坚实的网站结构,你可以在整个开发过程中强制执行。我不知道这个。看起来很有趣。是的-我在我的回答中链接到了这一点,如果您的开发人员是负责IA和对象定义的同一个人,那么代码生成工具很有用。在我的情况下,它们不是,尝试使用这些工具已经把我们弄得一团糟。尽管如此,我明白我的处境可能不是常态。
    ...
    var slidesFolder = globals.GetSlidesFolder();
    var slides = slidesFolder != null ? slidesFolder.GetSlides() : null;