Created Date(作成日)でサブアイテムの並び順を改善する


説明

CreatedComparerの現在の実装では、すべてのアイテムのバージョンをすべての言語バージョンで反復処理することで、Createdフィールドでの最小値を見つけています。

多数のバージョンで多数のアイテムを持つサイトでは、このアルゴリズムは最適なものではなく、コンテンツ ツリーでアイテムを展開する際に遅延が発生する可能性があります。

この挙動を改善するための解決策として、以下のものが考えられます:

このアプローチの問題点の一つは、この回避策を実施する前に作成されたアイテムに回避策が適用されるようにするには、そのアイテムの「_Item Created」フィールドを手動で入力する必要があることです。

これは、Sitecore APIでコンテンツ ツリーのすべてのアイテムの順で反復処理し、フィールド値を更新することで簡単に実施することができます。下記の手順3のサンプルの「FillItemCreatedField.aspx」ページで、利用可能なアイテムのバージョンからのCreatedフィールドの最小値で、すべてのコンテンツ アイテムを更新することができます。

解決策

この挙動を実装する方法の詳細は、以下の通りです:

  1. Masterデータベースのバックアップを作成します。
  2. 以下のテンプレート セクションに「__Item Created」という名前の共有フィールドを作成し、フィールドのタイプを「DateTime」に設定します。
    /sitecore/templates/System/Templates/Sections/Statistics
  3. 既存のアイテムの「__Item Created」フィールドを更新したい場合、この手順を実施する必要があります。ソリューションの「\Website\layouts」フォルダにアーカイブを解凍し、適切なURL(http://website/layouts/FillItemCreatedField.aspx)にアクセスし、「Process」ボタンを押下します。
  4. アイテムが作成されたときに、現在のUTC時間の情報を「__Item Created」フィールドに入力する、「item:created」イベントのハンドラ クラスを作成します。作成されたDLLアセンブリをサイトの/Binフォルダに配置します。

    public class ItemEventHandler
        {
            public void OnItemCreated(object Sender, EventArgs args)
            {
                string fieldName = "__Item Created";
                ItemCreatedEventArgs createdArgs = Sitecore.Events.Event.ExtractParameter(args, 0) as ItemCreatedEventArgs;
                if (createdArgs == null)
                {
                    return;
                }
                Item item = createdArgs.Item;
                if (item != null && item.Fields[fieldName] != null)
                {
                    using (new EditContext(item, SecurityCheck.Disable))
                    {
                        item.Fields[fieldName].Value = Sitecore.DateUtil.ToIsoDate(DateTime.UtcNow);
                    }
                }
            }
        }

  5. 「Web.config」ファイルを変更し、作成されたハンドラを「item:created」イベントに追加します:

    <event name="item:created">
    <handler type="[namespace].ItemEventHandler, [assembly name]" method="OnItemCreated"/>
    </event>

  6. 追加されたフィールドを使用するComparerクラスを作成します。なお、Sitecore 6.5 Update-5バージョンから、並び替えのロジックが改善され、すべてのComparerのベース タイプとしてExtractedKeysComparerが導入されたため、このステップの実施内容は、貴社で使用されているSitecoreバージョンによって変わります。

    Sitecore 6.5 Update-5以降の場合

    public class ItemCreatedComparer : CreatedComparer 
    {
            protected override int DoCompare(Item item1, Item item2)
            {
                return this.GetItemCreationDate(item1).CompareTo(this.GetItemCreationDate(item2));
            }
            public override IKey ExtractKey(Item item)
            {
                Assert.ArgumentNotNull(item, "item");
                return new KeyObj { Item = item, Key = this.GetItemCreationDate(item), Sortorder = item.Appearance.Sortorder };
            }
            private DateTime GetItemCreationDate(Item item)
            {
                if (item.Fields["__Item Created"] == null)
                {
                    return DateTime.MinValue;
                }
                DateTime creationDate = Sitecore.DateUtil.ParseDateTime(item.Fields["__Item Created"].Value, DateTime.MinValue);
                return creationDate;
            }
        }  

    旧Sitecoreバージョンの場合
    前の場合と同じコードを使用しますが、ExtractKeyメソッドの実装は除外します。これをコンパイルし、DLLアセンブリをサイトの/Binフォルダにコピーします。
  7. 「/sitecore/system/Settings/Subitems Sorting/」配下に「/sitecore/templates/System/Child Sorting」テンプレートを使用する「Item Created」アイテムを作成し、そのアイテムの「Type」フィールド値を[namespace].ItemCreatedComparer,[assembly name]に設定します。

サブアイテムの並び替えに関する詳細情報については、以下の記事の3.5章を参照してください:
http://sdn.sitecore.net/Reference/Sitecore%206/Presentation%20Component%20API%20Cookbook.aspx

註:並び替え順は、並び替えのルールよりも優先されます。「Set Subitems sorting」ウィンドウの「リセット」ボタンを押下することで、並び替え順をリセットすることができます。