サイトコアではパイプラインプロセッサーを作成することで他の処理に影響を与えずにパイプラインの処理の一部を変更したり、置き換えたりすることができます。Web.configの該当するパイプラインの定義の場所にカスタムぽイプラインプロセッサーを追加しますが、プロセッサーの定義と同時にパラメーターを渡したいことがあります。パラメーターをコンフィグファイルに指定できるようにすることでプロセッサーの再利用性を高めることができます。今回は定義時にパラメーターを設定する方法を記載します。
今回記載する カスタムパイプラインプロセッサーにパラメーターを設定する方法は以下のURLを参考にしています。
The Sitecore ASP.NET CMS Configuration Factory
http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2011/02/The-Sitecore-ASPNET-CMS-Configuration-Factory.aspx
検証環境は次の通りです
- Sitecore CMS 6.6 SP1
1. コンストラクタにパラメーターにパラメーターを渡す
パイプラインプロセッサーのコンストラクターに渡すパラメーターを定義するには <param> 用をを使用します。例えば次のように プロセッサーの定義の子要素に param 用をコンストラクタのパラメーターに渡す順番に定義します。
<processor type="Sample.CustomHttpRequestProcessor, Sample">
<param>One</param>
<param>Two</param>
</processor>
コンストラクタの定義は次のようになります。コンストラクターの引数の型はstring型を指定します。
/// <summary>
/// param タグで指定した値をコンストラクタの引数で取得することができる。
/// パラメーターはstring型
/// </summary>
/// <param name="param1"></param>
/// <param name="param2"></param>
public CustomHttpRequestProcessor(string param1, string param2)
{
Sitecore.Diagnostics.Assert.IsNotNullOrEmpty(param2, "param2");
this._p1 = param1;
this._p2 = param2;
}
2. プロパティにパラメーターを渡す
パイプラインプロセッサーにプロパティの名前に一致する要素を定義することで、サイトコアインフラストラクチャ(Sitecore.Configuration.Factory) がパイプラインプロセッサーのインスタンスを作成したと自動的にプロパティに値を設定してくれます。例えば次のように定義します。
<processor type="Sample.CustomHttpRequestProcessor, Sample">
<!-- プロパティに設定する例。型はstring以外も指定できる -->
<TestProperty>2014</TestProperty>
</processor>
プロセッサーのクラスには次のようにプロパティーを設定します。
public int TestProperty { get; set; }
3.コレクションガタンおプロパティーにパラメーターを渡す
コレクション型のプロパティーに要素を追加するようにパラメーターを設定することができます。hint:="list"を設定することで直接コレクション型のプロパティにstring型の要素を追加させることもできます。hint="list:someMethopd" のようにヒントを指定することでメソッドを経由してコレクションの要素を追加するように設定することもできます。そのためには プロセッサーのパラメーターの定義を次のように記述します。
<processor type="Sample.CustomHttpRequestProcessor, Sample">
<!--
コレクションに要素を追加する例1, hintでlistのみ指定し、オブジェクト追加用の
メソッドを指定しない場合はリストのプロパティに一致する名前で要素を作成する。
コレクションに追加するオブジェクトは val 要素を使用しているが任意の名前を指定可能。
-->
<TestList hint="list">
<val>1</val>
<val>2</val>
<val>3</val>
</TestList>
<!-- コレクションに設定する例2 AddItemというメソッドが実際には呼び出される -->
<TestList2 hint="list:AddItem">
<hoge>100</hoge>
<hoge>101</hoge>
<hoge>102</hoge>
</TestList2>
</processor>
パラメーターを受け取るコレクション型のプロパティーやメソッドは次のように定義します。hint属性でコレクション追加用のメソッドを指定しない場合はプロパティと同じ名前で要素を定義します。その要素の下に任意の名前で要素を追加しパラメーターとして設定する値を記述します。設定値はstring型になります。
public class CustomHttpRequestProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
public List<string> _list = new List<string>();
/// <summary>
/// TestListに文字列型の要素が追加される
/// </summary>
public List<string> TestList
{
get { return _list; }
set { _list = value; }
}
/// <summary>
/// AddItemを使用して要素を追加するためのメンバ変数
/// </summary>
private List<int> _list2 = new List<int>();
public void AddItem(string v)
{
_list2.Add(int.Parse(v));
}
}
4.XMLとしてパラメーターをパイプラインプロセッサーに設定する
パラメーターで渡したい値が複雑な場合、パラメーターで設定した値をXmlNode としてパイプラインプロセッサーに設定することができます。その場合はhint属性に raw:AddRawItem のようにパラメーターを渡すためのメソッドを指定します。たとえば次のように定義します。次のように定義するとサイトコアのインフラストラクチャにより item要素の数だけ AddRawItem が呼び出されます。
<processor type="Sample.CustomHttpRequestProcessor, Sample">
<TestList3 hint="raw:AddRawItem">
<item>
<val>Test1</val>
</item>
<item>
<val>Test5</val>
</item>
<item>
<val>Test3</val>
</item>
</TestList3>
</processor>
上記のように定義したあとパイプラインプロセッサーを次のように定義します。ヒントで指定したメソッドと同じ名前のメソッドを定義してください。メソッドの引数は XmlNode型になります。
public class CustomHttpRequestProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
private List<string> _complexList = new List<string>();
public void AddRawItem(XmlNode node)
{
_complexList.Add(node.SelectSingleNode("val").InnerText);
}
}
5.まとめ
説明は以上です。設定ファイルでパラメーターを渡せるようにすることでカスタムパイプラインプロセッサーの再利用性を高めることができるようになります。指摘点や誤りなどがありましたらご指摘lください。