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

时间:2014-06-09 08:57:30

标签: sitecore sitecore6

Sitecore相当新,并希望了解访问sitecore项目的最佳方式。我见过几种方式:

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

  2. 将所有页面ID(Sitecore项目ID)存储在Constants文件中。使用此命令使用GetItem(itemID)API查询Sitecore。

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

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

    感谢。

2 个答案:

答案 0 :(得分:1)

方法1似乎有点奇怪。我不知道为什么在你已经拥有身份证的情况下首先得到一系列物品,但也许我误解了你所说的话。

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

常数类适用于"具有里程碑意义的"肯定会存在的项目,因此GUID在代码中很好。 其中一些具有里程碑意义的项目可以是"配置项目"包含其他项ID的字段(这些字段的名称可能与"搜索中允许的模板")。随着网站的发展,这种方法允许Sitecore用户进行更改。

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

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

答案 1 :(得分:1)

就个人而言,我不想使用常量文件。如果您的客户或您的某个开发人员删除其中一个项目并创建一个新项目,会发生什么? 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,插入选项和模板将使您能够为您的网站创建一个铁质结构,如果内容编辑者做出意外更改(如替换项目),则不会破坏。


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