2012-08-14 44 views
3

我們在sitecore中有一個數據結構,它具有相同「深度」處的相同模板。我們正在製作教室內容,其特點是以下結構中的單元,課程和活動:從另一個分支獲取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項目上時,我想返回該特定unit中的下一個activity項目,如果該單元中沒有更多活動,則返回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下方。

回答

3

我認爲你有正確的想法。有幾件事情要注意的:

  1. unit.Database.SelectItems()開始在單位的數據庫的根,並且不使用單位作爲初始上下文。如果您打算向下遍歷獲取該單元的所有活動,則需要使用unit.Axes.SelectItems()

  2. 根據每個單元的活動項目數量,您可能要考慮使用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();