こんにちは。Sitecore技術担当の山田です。

今回はコマンドの処理中にプログレスバーを表示させる方法をご紹介します。

プログレスバーを表示させるにはProgressBox.Executeメソッドを使用します。
使い方は以下のサンプルコードをご覧ください。

public class MyCommand : Command
{
    public override void Execute(CommandContext context)
    {
        var item = context.Items[0];

        // プログレスバーを表示
        ProgressBox.Execute("ジョブ名", "タイトル", TooHeavyProcess, item);
    }

    protected void TooHeavyProcess(params object[] parameters)
    {
        var item = (Item) parameters[0];

        // 重たい処理
    }
}

プログレスバーといっても、実際に進捗率が表示されるわけではなく、処理中を表すダイアログが表示されるだけなので注意してください。

プログレスバーが閉じた後になにか処理を行いたい場合は、ProgressBox.ExecuteSyncメソッドを使用します。
以下のサンプルのように、ExecuteSyncメソッドはクライアントパイプラインのコンテキストで実行される必要があります。

public class MyCommand : Command
{
    public override void Execute(CommandContext context)
    {
        var item = context.item[0];

        // アイテムを渡すための引数を作成
        var args = new ClientPipelineArgs();
        args.CustomData["item"] = item;

        // クライアントパイプラインを実行
        Sitecore.Context.ClientPage.Start(this, nameof(MyProcess), args);
    }

    protected void MyProcess(ClientPipelineArgs args)
    {
        var item = (Item) args.CustomData["item"];

        // プログレスバーを表示
        // クライアントパイプライン中でしか使えないので注意
        ProgressBox.ExecuteSync("title", "icon", _ =>
        {
            // メイン処理
        }, _ =>
        {
            // 後処理
            SheerResponse.Alert("処理が終わりました!");
        });
    }
}

処理中にプログレスバーのメッセージを変更したい場合は、Context.Job.Status.AddMessageを使うことで実現できます。
処理の重くなりそうなコマンドを実装する際には、ぜひ参考にしてみてください。