フォームのバリデーション・プラグインの作成

フォーム機能で作成した設問に対するカスタム・バリデーションをプラグインで作成することができます。ここでは、設問タイプ「Text Input Group(テキスト(複数欄)」を用いて作成した設問の値がすべて数字かどうかをチェックするプラグインを紹介します。管理画面(CMS)の入力項目に対するバリデーションについては以下を参照してください。

サンプルプラグインのダウンロード

設問の作成

  • コミュニケーション」メニューから「設問」を選択します。
  • 設問タイプ「テキスト(複数欄)」を選択して「適用」ボタンをクリックします。
  • フィールド数「3」、コネクタ「-」、オプション「2,2,2」(フィールドの幅)を指定します。
  • ベースネームに任意の文字列(半角英数字)を入力し、保存します。

設問の作成画面

作成された設問は、公開側ページでは以下の画像のようになります(Websiteテーマを適用している時)。

生成された設問

プラグインの作成

プラグインの作成方法の基本については、以下のドキュメントを参照してください。

plugins/
 └ CustomValidation/ (root)
   ├ config.json (定義ファイル)
   ├ CustomValidation.php (プラグイン・クラス)
   └ locale/
      ├ en.json (翻訳ファイル)
      └ ja.json (翻訳ファイル)

カスタム・バリデーションを追加するには、config.jsonに「form_validations」というキーで記述します。

{
    "label"       : "CustomValidation",
    "id"          : "customvalidation",
    "component"   : "CustomValidation",
    "version"     : "1.0",
    "author"      : "Alfasado Inc.",
    "author_link" : "https://alfasado.net/",
    "description" : "It provides custom form validation.",
    "form_validations": {
        "custom_validation": {
            "component"  : "CustomValidation",
            "label"      : "Custom Validation",
            "method"     : "custom_form_validation"
        }
    }
}
キー
component PHPのクラス名
label ドロップダウンに表示されるラベル
method PHPクラスのメソッド

PHPのメソッドは以下の通りです。

function custom_form_validation ( $app, $question, $value, &$error_msg ) {
    $values = $app->param( 'question_' . $question->basename );
    // { [0]=> string(2) "03" [1]=> string(3) "1000" [2]=> string(3) "2000" }
    // $value => "03-1000-2000"
    foreach ( $values as $v ) {
        if (! ctype_digit( $v ) ) {
            $error_msg = $this->translate( 'The all values must be number.' );
            return false;
        }
    }
    return true;
}

第二引数に設問オブジェクト、第三引数に値(この場合、セパレータが「-」なのでそれぞれのフィールドに入力された値を「-」で連結した値が格納されます)、第4引数(リファレンスとして&付きで受け取ります)にエラーメッセージが渡されます。

テキスト(複数の値)形式の設問に入力した値は、「question_」+設問のベースネームとして受け取ると各値の配列となりますので、値をループでチェックします。バリデーション実装のルールは以下の通りです。

  • エラーがあった際は第四引数「&$error_msg」にエラーメッセージをセットして「false」を返す
  • エラーがない場合は「true」を返す