バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.xではエラーとなったルールのメッセージが配列になって返されます。

複数ルールを設定して、全てのルールを実行する方法(2.x系・1.3系共通)

バリデーションはモデルの$validateに設定した各ルールを上から行っていきます。デフォルトでは、ひとつのルールがエラーとなるとそのフィールドに対するバリデーションを停止しますが、'last'=>falseを設定するとエラー有無にかかわらず後続のバリデーションルールも実行するようになります。3つある場合は、1つ目・2つ目に設定するようなかたちになります。

// 例
var $validate = array(
    'errormsgtest' => array(
        'email' => array(
            'rule' => array( 'email'),
            'message' => 'Not email!',
            'last' => false
        ),
        'notempty' => array(
            'rule' => array( 'notEmpty'),
            'message' => 'Empty!',
        ),
    ),
);

validationErrorsとvalidateErrors

バリデーション処理後、エラーがあった場合、

$this->[Model名]->validationErrors

を使用してエラーメッセージを取得することができます。

似たようなもので

$this->validateErrors

がありますがコレ自体でバリデーション処理を行います。二重にvalidatesしないよう"validationErrors"の方を使うようにして下さい。

エラーメッセージの内容(1.3系では)

最後にエラーとなったバリデーションのメッセージを返します。上の例でいうと、入力値('errormsgtest')がブランクの場合、

  • デフォルトの状態('last'がtrue)では、ルール名'email'でバリデーションを終了させるため、Not email!'
  • 'last'をfalseに設定した場合は、ルール'email'がエラーとなっても最後('notempty')までバリデーションを実行するため、'Empty!'

が返却されます。

// ログに出力
$this->log( $this->[Model名]->validationErrors, LOG_DEBUG);
// viewに渡す
$this->set( 'valerror', $this->[Model名]->validationErrors);
// セッションに渡す
$this->Session->setFlash( $this->[Model名]->validationErrors);

// ログ出力例
// 'last' => trueの場合
Array
(
    [errormsgtest] => Not email!
)
// 'last' => falseの場合
Array
(
    [errormsgtest] => Empty!
)

エラーメッセージの内容(2.x系では)

やっと本題。配列で返します。
'errormsgtest'がブランクだった場合は、

  • デフォルトの状態('last'がtrue)では、ルール名'email'でバリデーションを終了させるため、'Not email!'のみ
  • 'last'をfalseに設定した場合は、ルール'email'がエラーとなっても最後('notempty')までバリデーションを実行するため、'Not email!'と'Empty!'

が返却されます。

// ログに出力
$this->log( $this->[Model名]->validationErrors, LOG_DEBUG);
// viewに渡す
$this->set( 'valerror', $this->[Model名]->validationErrors);
// セッションに渡す
$this->Session->setFlash( $this->[Model名]->validationErrors);

// ログ出力例
// 'last' => trueの場合
Array
(
    [errormsgtest] => Array
        (
            [0] => Not email!
        )
)
// 'last' => falseの場合
Array
(
    [errormsgtest] => Array
        (
            [0] => Not email!
            [1] => Empty!
        )
)

今回は、バリデーションエラーメッセージのデータの取り扱いについてでした。
基本的には、'last'=>falseを多用するより、エラーメッセージの伝え方でユーザに入力をうまいことやってもらうのが一番いいですよね~。
上の例でいうと、どちらもEnter email!としておけばいいですし。

  • このエントリーをはてなブックマークに追加

関連記事

独自のバリデーションルールを作成

CakePHPで組み込みバリデーションルールをつくる方法は、正規表現を定義する方法と独自メソッドを定義する方法の2つがあるようです。 参考 Custom Validation Rules 正規

数値系バリデーション

CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること

RSSフィードの取得

コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

FormヘルパーのMagicOption (マジックオプション) 

Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある

バリデーション前後に処理を追加できる「beforeValidate」「afterValidate」

CakePHPでは、「beforeValidate」「afterValidate」というバリデーション処理の前後で追加の処理を実装できるコールバック関数が用意されています。 beforeVali

CakePHP 2.x インストール

現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ

日付・時間のバリデーション

日付や時刻に関するバリデーションは以下のルールがビルトインされています。 date 日付 time 時刻 datetime 日時 (m:「月」を数字表記 / M:「月」を英語表記)

ネストしたリストを出力「nestedList」

DBやJSONからデータを取得して、そのデータをもとにメニュー表示などネストしたリストを出力させたい場合に「nestedList」が便利です。 ヘルパーに渡すデータは連想配列である必要があります。(

selectボックスを実装

今まで、selectボックスのgroupを作成するのにSet::Combineを使用していましたが、意外と簡単にできることに気付いてしまったので、ご紹介。(自分だけ知らなかったことに気付いた と言った

Comment

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

PAGE TOP ↑