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

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

正規表現を使用

'rule'に正規表現を直書きしてもいいようです。
正規表現はスラッシュで囲まれている必要があります。最後にiを付与すると大文字・小文字を区別しなくなります。

ここでは、「文字と数字のみで3文字以上となる値を入力」というバリデーション

public $validate = array(
    'code' => array(
        'rule' => '/^[a-z0-9]{3,}$/i',
        'message' => 'Only letters and integers, min 3 characters',
        'allowEmpty' => true	
    ),
);

「custom」ルールを使用

コアにも「custom」というルールが用意されています。
正規表現と同じです。実際の使用方法は、プロフィール系データ バリデーション

バリデーションメソッドを作成

メソッドを作成してバリデーションを行うこともできます。注意点としては、メソッドに渡されるバリデーション対象の$checkにはフォームから渡されるデータ全てが連想配列で渡される点です。

class User extends AppModel {
    public $validate = array(
        'promotion_code' => array(
            'rule'    => array( 'limitDuplicates', 25),
            'message' => 'This code has been used too many times.'
        )
    );

    public function limitDuplicates( $check, $limit) {
        // $check will have value: array( 'promotion_code' => 'some-value')
        // $limit will have value: 25
        $existing_promo_count = $this->find( 'count', array(
            'conditions' => $check,
            'recursive' => -1
        ));
        return $existing_promo_count < $limit;
    }
}

メソッドは各モデル内に定義することができますし、
広く使用する場合は、app_model.php内に定義すればどこでも使用可能になります。(app/app_model.php)

「UserDefined」ルールを使用

実際に使うか微妙ですが、UserDefinedを使用して他のモデルに定義したメソッドを参照することも可能です。
userDefined(mixed $check, object $object, string $method, array $args = null)

public $validate = array(
    'xxx' => array(
        'rule' => array( 'UserDefined', 'OtherModel', 'Method', 'args'),
        'message' => 'xxx error',
        'allowEmpty' => true	
    ),
);

つくってみたルールです。

緯度・経度 (degree形式)

var $validate = array(
    'latlng' => array(
        'rule' => '/^-?([0-8]?[0-9]|90)\.[0-9]{1,6},-?((1?[0-7]?|[0-9]?)[0-9]|180)\.[0-9]{1,6}$/',
        'message' => 'invalid latitude and longitude.',
    ),
);

カンマ区切りで緯度経度が表現されているか。(竹島であれば、37.243004,131.864469)
緯度:-90.000000 ~ 90.000000 / 経度: -180.000000 ~ 180.000000
(ミリ秒形式<北緯~ 東経~>などには非対応)

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

関連記事

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

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

パス定数と変更方法やURLの取得

CakePHPは基本的にはディレクトリそのまま配置することで構築が可能ではありますが、設定パスを変更することでセキュリティに考慮した構成にすることや運用性をもたせたものにすることが可能になります。

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

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

ログインに追加の条件を付与する「scope」

ユーザ登録では、仮登録処理(status=1)から送付したメール内のリンクをクリックしてもらい本登録(status=0)を行ってもらう実装をしました。仮登録の状態ではログインできないように実装するには

Js/Cssファイルの読み込みや出力する方法

CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン

DebugKitを導入

定番のブログチュートリアルをこなして、定番のDebugKitを導入してみました。 2.3からはCakePHPインストール直後に以下のように導入を推奨するような警告メッセージが表示されるようになりまし

Syslogログエンジン

2.4から「Syslog」ログクラスが追加され、簡単にSyslogを使用できるようになりました。 CakePHP側の設定はbootstrap.php内のCakeLogコンフィグのengineを'Sy

CakePHP インストール時エラーの対処

CakePHPインストール時に出くわすであろうエラーの原因と対処方法についてまとめてみました。前提として、WebサーバはApache、データベースはMySQLとしています。 Timezone未設

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

Jsヘルパーを使用してAjax更新

更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head

Message

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

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑