今回はアイテムのパブリッシュ時のメッセージをカスタマイズする方法についてご紹介します。
普段Sitecoreを使っていてこのようなメッセージを目にすることがあるかと思います。
こちらはSitecore標準のパブリッシュ時のメッセージですが、このメッセージはカスタマイズできます。
Sitecore.Shell.Applications.Dialogs.Publish.PublishForm,Sitecore.Clientは、パブリッシュダイアログに関するdllです。
このdllにPublishForm.csというクラスがあり、その中にConfirmPublishingOptionsメソッドがあります。このPublishForm.csを継承するクラスを作成し、ConfirmPublishingOptionsメソッドを上書きすることでパブリッシュ時のメッセージをカスタマイズすることができます。
今回はSitecore標準のパブリッシュ時のメッセージは残しつつサブアイテムをパブリッシュにチェックが入っていてかつ、パブリッシュする配下のアイテムが5個より多いときにパブリッシュするアイテムの配下のアイテムの数を含めたメッセージを出すようにカスタマイズします。
作成手順
パブリッシュ時のメッセージをカスタマイズするクラスの作成
PublishForm.csを継承するクラスとしてCustomPublishForm.csを作成します。
PublishForm.csの中のConfirmPublishingOptionsメソッドがパブリッシュ時のメッセージに関するメソッドであるため、このメソッドを今回のカスタマイズ用に編集します。
コードサンプル
using Sitecore.Data;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Shell.Applications.Dialogs.Publish;
using Sitecore.Web.UI.Sheer;
namespace SampleSite.Website.Services
{
public class CustomPublishForm : PublishForm
{
protected void ConfirmPublishingOptions(ClientPipelineArgs args)
{
Assert.ArgumentNotNull((object)args, nameof(args));
if (!args.HasResult)
{
// サブアイテムをパブリッシュのチェックフラグ
bool flag1 = this.PublishChildren.Checked;
// 関連アイテムをパブリッシュのチェックフラグ
bool flag2 = this.PublishRelatedItems.Checked;
// リパブリッシュのチェックフラグ
bool flag3 = this.Republish.Checked;
string str = string.Empty;
var db = Sitecore.Configuration.Factory.GetDatabase("master");
var item = db?.GetItem(new ID(this.ItemID));
int itemCount = item?.GetChildren()?.Count ?? 0;
if (!string.IsNullOrEmpty(this.ItemID))
{
// カスタマイズ部分(サブアイテムにチェックが入っていてかつ配下のアイテムが5個より多い場合)
if (flag1 && itemCount > 5)
str = string.Format(Translate.Text("You are attempting to publish {0} subitems, which may impact other content being published."),itemCount);
else if (flag2 & flag1)
str = Translate.Text("You are about to publish the current item, its subitems, and related items.");
else if (flag2)
str = Translate.Text("You are about to publish the current item and its related items.");
else if (flag1)
str = Translate.Text("You are about to publish the current item and its subitems.");
}
else
str += Translate.Text("You are about to republish the whole database.");
if (flag3)
{
if (!string.IsNullOrEmpty(str))
str += "\n\n";
str += Translate.Text("Republishing is an expensive operation that overwrites every item in the selected languages, even if that data has not changed.\nYou should only republish if the databases appear to be inconsistent and only after you have tried to fix the problem by performing a Smart Publishing operation.");
}
if (!string.IsNullOrEmpty(str))
{
SheerResponse.Confirm(str + "\n\n" + Translate.Text("Do you want to proceed?"));
args.WaitForPostBack(true);
}
else
{
this.ConfirmedOptions = true;
this.Next();
}
}
else
{
if (!(args.Result == "yes"))
return;
this.ConfirmedOptions = true;
this.Next();
}
}
}
}
今回カスタマイズした場所は以下の場所となります。
// カスタマイズ部分(サブアイテムにチェックが入っていてかつ配下のアイテムが5個より多い場合)
if (flag1 && itemCount > 5)
str = string.Format(Translate.Text("You are attempting to publish {0} subitems, which may impact other content being published."),itemCount);
Publish.xmlの記述
次に上書きしたクラスを認識させるためにPublish.xmlに上書きしたクラスの名前空間を記述します。
デフォルトでPublish.xmlはサイト名\sitecore\shell\Applications\Dialogs\Publishにあります。
デフォルトのPublish.xmlをそのまま直接編集するのは推奨されないため、デフォルトのPublish.xmlをコピーしたものを新しいフォルダを配置してそこでPublish.xmlを編集するようにします。
今回はサイト名\sitecore\shell\override\Applications\Dialogs\Publish配下に新しくフォルダを作成しそこの配置します。
Publish.xmlの以下の部分のCodeBesideの部分を今回上書きしたクラスの名前空間に合わせて書き換えます。
今回上書きするクラスに合わせて書くと以下の様になります。
辞書アイテムの作成
最後にパブリッシュ時のメッセージを出すための辞書アイテムの作成を行います。
辞書アイテムはCoreデータベースにあり、/sitecore/system/Dictionaryのアイテムパスにあります。
今回作成する辞書アイテムを次のように作成します。Keyにはコード側に書く英語の文章、Phraseには日本語の文章を入力します。{0}は上のコードサンプルのitemCountに相当します。日本語版でアイテムを作成しないと日本語でメッセージが出力されないのでご注意ください。

すると、サブアイテムをパブリッシュにチェックが入っていて、配下のアイテムが5個より多いとカスタムしたパブリッシュメッセージを出力することができます。
参考サイト
https://sitecore.stackexchange.com/questions/17926/handling-publish-dialog-events
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。