3

同じ「深さ」で同じテンプレートを特徴とするデータ構造が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
}

兄弟( "Following"& "Preceeding")は、必要に応じlessonてではなく、同じ下にある直接の兄弟のみを返すため、機能しませんunit

4

1 に答える 1

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();
于 2012-08-14T23:19:58.047 に答える