アイテム作成時にカスタムトークンを置換する実装を[Sitecore CMS]アイテム作成時に置換されるカスタムトークンを実装するで作成してみました。今回は、フィールドレンダリング時に$RenderHello カスタムトークンを置換する処理を実装してみます。

SDNのドキュメント データの再利用および共有 のトークン置換を参考にしています。

検証環境

  • Sitecore CMS 6.6 Service Pack 1

フィールドレンダリング時にトークンを置換するために今回は renderFieldパイプラインにカスタムプロセッサーを実装してみます。

1. renderFieldパイプラインカスタムプロセッサーの作成

今回は、CustomRenderingTokenSubstitution というクラスを作成しました。MessageプロパティはWeb.configに定義する カスタムプロセッサの設定で定義するパラメータが格納されます。CustomRenderingTokenSubstitution クラスのPipeline メソッドでページのコンテキストがページエディターの編集モード以外で $RenderHello トークンがフィールドの含まれている場合は、その文字列を Message プロパティの文字列で置き換えています。

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

namespace SCTest.Core
{

    public class CustomRenderingTokenSubstitution
    {
        public string Message { get; set; }

        public void Process(Sitecore.Pipelines.RenderField.RenderFieldArgs args)
        {
            // 編集モードの場合は置き換えを行わない。
            if (Sitecore.Context.PageMode.IsPageEditorEditing)
            {
                return;
            }

            Sitecore.Diagnostics.Assert.IsNotNullOrEmpty(this.Message, "Message");
            // このようにしてメッセージをローカライズする方法もある
            //string localizeMessage = Sitecore.Globalization.Translate.Text(this.Message);

            if (!string.IsNullOrEmpty(args.Result.FirstPart))
            {
                args.Result.FirstPart = args.Result.FirstPart.Replace("$RenderHello", this.Message);
            }
            if (!string.IsNullOrEmpty(args.Result.LastPart))
            {
                args.Result.LastPart = args.Result.LastPart.Replace("$RenderHello", this.Message);
            }
        }
    }
}

上記クラスをビルドして作成されたアセンブリを Websiteのbinフォルダに格納します。

あとは、renderField パイプラインにカスタムプロセッサの定義を追加します。 AddBeforeAndAfterValues プロセッサの前にカスタムプロセッサの定義を追加しました。<Message>タグでMessageプロパティに設定する文字列を指定しています。プロセッサの数が多いので下記では関係のあるプロセッサ以外は省略しています。

      <renderField>
        ..
        <processor type="SCTest.Core.CustomRenderingTokenSubstitution, SCTest">
          <Message>Hello The World</Message>
        </processor>
        <processor type="Sitecore.Pipelines.RenderField.AddBeforeAndAfterValues, Sitecore.Kernel"/>
        ..
      </renderField>

2.動作確認

あとは動作確認してみます。ページエディターの編集モードで フィールドにトークン文字列 $RenderHello を設定します。

ページエディターをプレビューモードにすると、 トークンが置換されてレンダリングされました。

3.まとめ

説明は以上です。実行時に動的にフィールドのトークンを置換するサンプルを記載しました。あまり複雑であったりトークンの数が多い場合はパフォーマンスの低下が発生しないように注意してください。