[CakePHP]バリデーションエラーメッセージを共通化する

CakePHPによる実践Webアプリケーション開発を参考に

ルール名*1ごとに一般的なエラーメッセージを用意しておく。

こうしておくことでいちいちバリデーションのmessageを書かなくても済んでかなり楽ちん。

AppModel

<?php
class AppModel extends Model
{
    static $error = array(
        "postal"      => "郵便番号の形式が正しくありません。",
        "cc"              => "クレジットカード番号の形式が正しくありません。",
        "date"            => "日付の書式が正しくありません。(入力例:2009-01-01)",
        "email"           => "メールアドレスの形式が正しくありません。",
        "url"             => "URLの形式が正しくありません。",
        "ip"              => "%sのIPアドレスの形式が正しくありません。",
        "extension"       => "%sのファイル形式が正しくありません。",
        "inList"          => "%sに不正な値が指定されました。",
        "blank"           => "%sにスペース、タブ、改行以外の文字が含まれています。",
        "decimal"         => "%sは小数点以下%d桁の値で入力してください。",
        "range"           => "%sは%dより大きく、%dより小さい値で入力してください。",
        "isGreater"       => "%sは%3\$dより大きい値で入力してください。",
        "isLess"          => "%sは%3\$dより小さい値で入力してください。",
        "greaterOrEqual"  => "%sは%3\$d以上の値で入力してください。",
        "lessOrEqual"     => "%sは%3\$d以下の値で入力してください。",
        "notEqual"        => "%sは%3\$d以外の値で入力してください。",
        "isUnique"        => "この%sはすでに使用されています。",
        "between"         => "%sは半角%d〜%d文字の間で入力してください。",
        "minLength"       => "%sは%d文字以上で入力してください。",
        "maxLength"       => "%sは%d文字以内で入力してください。",
        "alphaNumeric"    => "%sは半角英数で入力してください。",
        "numeric"         => "%sに数字以外の文字が入力されています。",
        "equalTo"         => "%sが%sではありません。",
        "notEmpty"        => "%sに何も入力されていません。");

    function invalidFields($options = array())
    {
        $errors = parent::invalidFields($options);
        
        foreach($errors as $key => $val)
        {
            if(array_key_exists($val, AppModel::$error))
            {
                $params = $this->validate[$key][$val]["rule"];
                if(is_array($params)) $params[0] = $this->getColumnAliasName($key);
                else                  $params = $this->getColumnAliasName($key);
                
                $errors[$key] = vsprintf(AppModel::$error[$val], $params);
            }
        }
        $this->validationErrors = $errors;
        return $errors;
    }
}
?>

invalidFields中のgetColumnAliasName()はカラムの別名取得メソッド。

通常はフィールド名がDBのカラム名(英語名)になるので、

モデルにカラムの別名(Japanese名)を持っておき、表示にはそっちを使用するようにしてます。

使い方

<?php
class Test extends AppModel
{
    var $validate = array("content" =>array(
                       "between"  => array("rule" => array("between", 4, 32)),
                       "alphaNumeric" => array("rule" => "alphaNumeric"),
                       "notEmpty" => array("rule" => "notEmpty",
                                           "message" => "何も入力してないよ〜ん")));
                       
}
?>

messageを指定すればそこだけ上書きすることも。

*1:ここでのルール名は実際のルール名(バリデーションメソッド名)ではなく、こちらで指定する任意のルール名。これならかなり細かくメッセージパターンを分けることが出来る。