从另一个分支获取Sitecore兄弟姐妹

时间:2012-08-14 22:22:02

标签: sitecore sitecore6

我们在sitecore中有一个数据结构,它在相同的“深度”具有相同的模板。我们正在制作课堂内容,其中包含以下结构中的单元,课程和活动:

Unit 1
-- Lesson 1
---- Activity 1
---- Activity 2
-- Lesson 2
---- Activity 3
---- Activity 4
Unit 2
-- Lesson 3
---- Activity 5
---- Activity 6
-- Lesson 4
---- Activity 7
---- Activity 8

等等。当我在activity项目上时,我想返回该特定activity中的下一个unit项目,如果该单元中没有其他活动,则返回null。

我能够做到的最好的目标是定位当前活动unit祖先(容易找到)并获取其下的所有activities,然后遍历所有这些活动以获取上一个/下一个活动。似乎必须有更好的方法来实现这一点,所以我想我会把它扔出去寻找想法。

当前代码

Item unit = Sitecore.Context.Item.Axes.SelectSingleItem("ancestor-or-self::*[@@templatename='Unit']");
Item[] allActivities = unit.Database.SelectItems("ancestor-or-self::*[@@templatename='Activity']");

foreach(Item thisitem in allActivities){
    //Process here
}

兄弟姐妹(“关注”和“超越”)不起作用,因为它只会根据需要返回同一lesson下的直接兄弟,而不是unit

1 个答案:

答案 0 :(得分:3)

我认为你有正确的想法。需要注意以下几点:

  1. unit.Database.SelectItems()从单位数据库的根开始,不使用该单位作为起始上下文。如果您打算向下遍历获取该单元的所有活动,则需要使用unit.Axes.SelectItems()

  2. 根据每个单元的活动项目数量,您可能需要考虑使用sitecore快速查询或可能使用Lucene来处理选择。

  3. 以下是如何处理上一个/下一个逻辑的示例。如果/当前一个或下一个兄弟不可用时,.FirstOrDefault()的使用将返回null。

    Item unit = Sitecore.Context.Item.Axes.SelectSingleItem("ancestor-or-self::*[@@templatename='Unit']");
    Item[] unitActivities = unit.Axes.SelectItems("descendant::*[@@templatename='Activity']");
    // The order of 'unitActivities' defaults to the order that items appear in Sitecore tree.
    // Perform additional sorting here if needed
    
    var nextActivity = unitActivities.SkipWhile(i => i.ID != Sitecore.Context.Item.ID).Skip(1).FirstOrDefault();
    var prevActivity = unitActivities.Reverse().SkipWhile(i => i.ID != Sitecore.Context.Item.ID).Skip(1).FirstOrDefault();