我们在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
。
答案 0 :(得分:3)
我认为你有正确的想法。需要注意以下几点:
unit.Database.SelectItems()
从单位数据库的根开始,不使用该单位作为起始上下文。如果您打算向下遍历获取该单元的所有活动,则需要使用unit.Axes.SelectItems()
根据每个单元的活动项目数量,您可能需要考虑使用sitecore快速查询或可能使用Lucene来处理选择。
以下是如何处理上一个/下一个逻辑的示例。如果/当前一个或下一个兄弟不可用时,.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();