Sitecore では、 フィールドのデフォルト値を格納する場所である データテンプレートのスタンダードヴァリューアイテムのフィールドにトークンを設定することでアイテム作成時に トークン文字列を 置換してフィールドの設定することができます。

今回は$hello というカスタムトークンを作成する方法のメモを記載いたします。

検証環境

  • Sitecore CMS 6.6 Service Pack 1

カスタムトークンを実装する方法ですが、アイテム作成時にトークンを動的な値に置換する処理は Web.config の下記 MasterVariableReplacer で定義されたクラスのインスタンスが行います。

<setting name="MasterVariablesReplacer" value="Sitecore.Data.MasterVariablesReplacer,Sitecore.Kernel.dll"/>

カスタムトークンをサポートするように MasterVariableReplacer タグで設定されている MasterVariablesReplacer のサブクラスを作成する方法を考えたのですが、メソッドをオーバーライドしてカスタムトークンをサポートするように実装するにはいまいちな気がしたので、今回はexpandInitialFieldValue パイプラインにカスタムプロセッサーを作成する方法を採用することにしました。

ちなみに、使用できるトークンは次のものがあります。トークンの簡単な説明と値の例を掲載します。

  • $name  - アイテムの名前
  • $id - アイテムのID 例:{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
  • $parentid - 親アイテムのID 例:{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
  • $parentname - 親アイテムの名前
  • $date - 作成日の文字列 例:20130915
  • $time - 作成時間の文字列 例:223050
  • $now -  作成日時の文字列 例:20130915T223050

1. カスタムトークンをサポートする ExpandInitialFieldValueProcessor プロセッサーを作成する

アイテムのフィールドに $hello というトークンが含まれていた場合、プロセッサー定義で記述されたコンフィグの文字列で置換するCustomTokenTokenProcessorクラスを作成してみました。Greetingプロパティはプロセッサーの定義を Web.config に記述する場所で設定します。実装の方法としてはフィールドに $hello という文字列が含まれている場合に、 その文字列を Greeting プロパティの値で置換するようにしています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SCTest.Core
{
    using Sitecore.Pipelines.ExpandInitialFieldValue;
    using Sitecore.Diagnostics;
    public class CustomTokenTokenProcessor : ExpandInitialFieldValueProcessor
    {
        public string Greeting { get; set; }
        public override void Process(ExpandInitialFieldValueArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
            if (args.SourceField.Value.Contains("$hello"))
            {
                args.Result = args.Result.Replace("$hello", this.Greeting);
            }
        }       
    }
}

作成したクラスをビルドして、Sitecore の Website の bin フォルダに格納します。あとは、 Web.config のexpandInitialFieldValueパイプラインに作成したプロセッサの定義を追加します。

サンプルとして次のようにReplaceVariablesプロセッサーの後にカスタムトークンプロセッサーを追加しました。Greetingとうタグを設定して Greetingプロパティに コンニチワ!! という値が設定されるようにしています。

<expandInitialFieldValue help="Processors should derive from Sitecore.Pipelines.ExpandInitialFieldValue.ExpandInitialFieldValueProcessor">
  <processor type="Sitecore.Pipelines.ExpandInitialFieldValue.SkipStandardValueItems, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.ExpandInitialFieldValue.CheckSharedField, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.ExpandInitialFieldValue.ReplaceVariables, Sitecore.Kernel"/>
  <processor type="SCTest.Core.CustomTokenTokenProcessor, SCTest">
   <Greeting>コンニチワ!!</Greeting>
  </processor>
</expandInitialFieldValue>

2.動作確認

実際に動作確認してみます。データテンプレートの定義アイテムを作成し、スタンダードヴァリューに $hello というトークンを含めておきます。例では Sampleというフィールドに$hello というカスタムトークンを設定しました。

実際にコンテンツアイテムを作成すると、次のようにトークンが置換されました。

3.まとめ

説明は以上です。カスタムトークンの作成方法の実装例をご紹介しました。指摘点や誤りなどがありましたらご連絡ください。

参考情報として、 MasterVariablesReplacer を継承して カスタムトークンを作成するサンプルが掲載されているURLを掲載しておきます。

Add Custom Standard Values Tokens in the Sitecore ASP.NET CMS
http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2013/01/Add-Custom-Standard-Values-Tokens-in-the-Sitecore-ASPNET-CMS.aspx