独自のバリデーションルールを作成
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ではbootstrap.php内にあらかじめアプリケーションログの設定が書かれています。2.xで日付ごとにログファイルが切り替わるよう設定してみました。 日ごとにログを切り替え
-
-
バリデーションエラーメッセージの取得
CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.
-
-
ログインに追加の条件を付与する「scope」
ユーザ登録では、仮登録処理(status=1)から送付したメール内のリンクをクリックしてもらい本登録(status=0)を行ってもらう実装をしました。仮登録の状態ではログインできないように実装するには
-
-
radioボタンを実装
Radioボタンの実装は、セレクトボックスとほぼ同じです。 個人的にはラジオボタンをすすんで使用することは少ないのですが、2択くらいの選択肢であれば非常に便利ですよね。 今回は、その実装方法 デモ
-
-
RSSフィードの取得
コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://
-
-
FormヘルパーのMagicOption (マジックオプション)
Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある
-
-
パス定数と変更方法やURLの取得
CakePHPは基本的にはディレクトリそのまま配置することで構築が可能ではありますが、設定パスを変更することでセキュリティに考慮した構成にすることや運用性をもたせたものにすることが可能になります。
-
-
複数ファイルアップロードフォーム
CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (
-
-
ハッシュ関数の選択とハッシュ化処理
CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ
-
-
SQLクエリーをログに出力する
SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処

