こんにちは。Sitecore技術担当の山田です。
皆さんはSitecoreのバケット機能を使用していますか?
バケット機能はニュースやブログ記事アイテムなどを自動でフォルダに振り分けてくれるのでとても便利です。
一方で、フォルダ振り分けのルールには以下の3つしかありません。
- アイテムの作成日で振り分け
- アイテムの名前で振り分け
- アイテムのIDで振り分け
これだけでは「投稿日フィールドの日付で振り分ける」といったような動作を実現することはできません。
そこで今回は、フォルダ振り分けのルールに任意のDateフィールドを使う方法をご紹介します。
カスタマイズ方法
- 新規のプロジェクトを作成し、参照に
Sitecore.Kernel.dll
を追加します。(既存のプロジェクトでも問題ありません) - プロジェクトに以下のクラスを追加します。
public class CreateDateFieldBasedPath<T> : RuleAction<T> where T : BucketingRuleContext
{
/// <summary>
/// フィールドID
/// </summary>
public ID FieldId { get; set; }
/// <summary>
/// 日付フォーマット
/// </summary>
public string Format { get; set; }
public override void Apply(T ruleContext)
{
var date = ruleContext.CreationDate;
var item = ruleContext.Database.GetItem(ruleContext.NewItemId);
if (item != null)
{
var field = (DateField)item.Fields[FieldId];
if (field != null)
{
date = field.DateTime;
}
}
var format = Format;
if (string.IsNullOrEmpty(format))
{
format = BucketConfigurationSettings.BucketFolderPath;
}
ruleContext.ResolvedPath = date.ToString(format, Sitecore.Context.Culture);
}
}
- プロジェクトをビルドして、アセンブリをウェブサイトの
bin
フォルダに配置します。 - masterデータベースに、以下のアイテムを作成します。
- アイテム名:
Resolve Custom Date Field Based Path
- パス:
/sitecore/system/Settings/Rules/Definitions/Elements/Bucketing
- テンプレート:
/sitecore/templates/System/Rules/Action
- 表示名(オプション):
Dateフィールドに基づいて Path を解決
- 作成したアイテムで以下のフィールドを設定します。
{名前空間}
と{アセンブリ名}
は先ほど作成したものと合わせてください。
- Text:
[fieldid,Tree,root=/sitecore/Templates,custom field] フィールドに基づいて Path を解決します: [format,Format,yyyy/MM/dd/HH/mm,this] 形式.
- Type:
{名前空間}.CreateDateFieldBasedPath,{アセンブリ名}
これで、アイテムバケット設定に新しいアクションが表示されます。
使い方
/sitecore/system/Settings/Buckets/Item Buckets Settings
を選択します。Rule
フィールドの「ルールを編集する」をクリックします。- 新しいルールを追加します。
- アクションで「custom field フィールドに基づいてPathを解決します:this 形式」を選択します。 条件はお好きなものを選択してください。
custom field
をクリックして、パスの解決に使用するフィールドの定義アイテムを選択します。this
をクリックして、yyyy/MM
を入力してください。
これで、指定したDateフィールドの値に基づいたフォルダに振り分けられるようになります。