SITECORE MANIA 開発者向け技術ブログ

管理機能

高原

高原

ワークフローの状態遷移時にカスタムバリデーションを実行する方法

Sitecoreにはワークフローという機能が標準で備わっており、これを使用することでコンテンツの作成、編集、承認、公開などの一連のプロセスを制御することが出来ます。ワークフローもバリデーションも、構築時に標準で備わっているものはありますが、カスタムで作成することも可能です。

今回はSitecore標準の検証ルールを使用しつつ、カスタムのバリデーションチェックの処理をするアクションを作成する手順を紹介していきます。

カスタムワークフローの作成

今回はカスタムワークフローの作成については本題ではないので詳細は割愛しまして、デフォルトで備わっているサンプルワークフローをコピーしてカスタムワークフローとして使用します。

「下書き」、「承認待ち」、「承認済み」とあると思いますが、これらはワークフローの“状態”であり、この状態を変化させるにあたってコマンドやアクションを発火させることが出来ます。そして配下にある「投稿」や「オンセーブ」が“コマンド”であり、これらは次のワークフロー“状態”に進めることが出来ます。


カスタムパイプラインの作成

次にプログラムの実装です。任意の場所にクラスを作成し、Processメソッドを作成します。またその時、引数には[WorkflowPipelineArgs]型を指定してください。そうすることでいろいろな値を取得できます。この処理ではDataItem(対象のアイテム)を取得しています。今回は純粋にアイテムごとに設定された検証ルールを実行していくだけの処理をします。

    public class Validation
    {
        public void Process(WorkflowPipelineArgs args)
        {
            if (args.DataItem != null)
            {
                //アイテムに紐づいたワークフロー用の検証ルールの取得
                ValidatorCollection validators = ValidatorManager.BuildValidators(ValidatorsMode.Workflow, args.DataItem);
                //必須入力フィールドを含むすべてのバリデーションを実行
                ValidatorOptions options = new ValidatorOptions(true);
                //実際のバリデーション処理
                ValidatorManager.Validate(validators, options);

                //各バリデーションの結果を確認してError以上のものがあったらメッセージを表示して処理終了
                foreach (BaseValidator validator in validators)
                {
                    ValidatorResult result = validator.Result;
                    if (result >= ValidatorResult.Error)
                    {
                        SheerResponse.Alert("検証エラーが存在するため、ワークフローを実行できません。");
                        args.AbortPipeline();
                    }
                }
            }
        }
    }

見慣れない処理部分の解説

ValidatorCollection validators = ValidatorManager.BuildValidators(ValidatorsMode.Workflow, args.DataItem);

ここでは、アイテムに紐づいた検証ルールを取得しています。具体的には、各アイテムの「検証ルール」セクションにある[ワークフロー用の検証ルール]フィールドで選択されている検証ルールアイテムを取得します。

ValidatorOptions options = new ValidatorOptions(true);

検証の際のオプションです。trueにすると必須フィールドを含めたすべてのバリデーションをチェックします。falseの場合は必須フィールドは含めずにバリデーションチェックを実行します。


カスタムアクションの作成

今回は、「下書き」から「承認待ち」に進める際にバリデーションを入れたいので、「Submit」コマンドの配下に“アクション”を挿入します。作成したアクションアイテムの[タイプ]フィールドにアセンブリ参照を記載します。

確認

ここまで設定が出来たら、実際の処理をみていきましょう。試しに、[Title]フィールドを必須フィールドにして検証エラーが出るかを試してみます。アイテムには各々検証ルールが設定できますが、フィールドに対して検証ルールを設定したい場合は、各テンプレート側で設定します。必須フィールドにするためには、検証ルール設定アイテムの「Required」を選択します。

では、このテンプレートを使用して作成したアイテムに、カスタムワークフローを紐づけて状態を進めてみます。タイトルフィールドに何も入力していない状態では、プログラム内で設定したエラーメッセージが表示されているのがわかるかと思います。  

今回はSitecore標準の検証ルールを使用していきましたが、カスタムの検証ルールを作成したりカスタムのバリデーション処理を作成したりと様々な場面で応用できます。使用する際にはぜひ参考にしてみてください。

Sitecoreデフォルトのバリデーションアクション

カスタマイズの必要がなく、Sitecore標準のバリデーションチェックを実行したい場合、Sitecoreに元々実装されている”Validation Action”テンプレートアイテムをコマンドの下に挿入することで利用手順出来ます。この方法はSitecore公式ドキュメントにも記載されていますので参考にしてください。

参考:標準アクションおよびカスタム アクション

以下実際の手順です。

  1. Validation Actionを挿入する
  2. [タイプ]フィールドに”Sitecore.Workflows.Simple.ValidatorsAction, Sitecore.Kernel”を挿入
  3. [最大許容範囲]フィールドに検出したいレベルを挿入(今回はError)
  4. ワークフローを実行すると結果画面が表示される

 

※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス