独自のバリデーションルールを作成
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になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること
-
Cookieログイン
今回は、ログイン画面でよくみかけるクッキーログインの機能を使ってみます。 CakePHPには、Cookieコンポーネントがあります。(PHPのsetcookieメソッドのラッパー)メソッドはwr
-
ネストしたリストを出力「nestedList」
DBやJSONからデータを取得して、そのデータをもとにメニュー表示などネストしたリストを出力させたい場合に「nestedList」が便利です。 ヘルパーに渡すデータは連想配列である必要があります。(
-
入力文字列の長さ(文字数)をバリデーション
CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt
-
Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head
-
コントローラ内でバリデーション処理を呼び出す
CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。
-
Formヘルパーのinputタグのdiv/labelなどの設定
Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま
-
バリデーションエラーメッセージの取得
CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.
-
SQLクエリーをログに出力する
SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処
-
CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」
「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し