独自バリデーションの作成とその名前をどうにかせんといかん
ようやく仕事絡みでCakePHPに関われるようになったはいいが、
同時に2件の案件を進めることになったので、途端に自作ビヘイビア、コンポーネント、ヘルパー、バリデーションの最新版の管理がややこしくなってきた。
という訳で、下記のページを参考にプラグイン化をやってみる。
第4回CakePHP勉強会@TokyoのLTで発表してきました! - 忍び歩く男 - SLYWALKER
よく使う独自バリデーションルールをプラグインのbehaviorにまとめる - cakephperの日記(cakePHP1.2ベース)
共通のプラグインフォルダを使用するので、
アプリ毎にビヘイビアがを用意して片っ方を修正したらもう片方にコピーして....
みたいなことをする必要がなくて、いい感じ。
日本語絡みのバリデーションはcakephperさんのcakeplusを使用させてもらい、
その他、必要なやつを独自に作成。
■文字数を表示幅でチェック
広告コンテンツのため、見た目の幅(全角を2、半角を1)で制限する必要があり、
mb_strwidth()関数で幅をチェックする。
■電話番号チェック
探せばありそうだったけど、作った方が早そうなので作る。
■値の重複チェック
下記のページを参考にさせて頂きました。
實松アウトプット: バリデーションでメールアドレスの重複登録チェック2
■どっちかのフィールドを必須項目にする
メールアドレスか電話番号のどちらかに入力を必須とさせる。
以前に似たようなのを見た記憶があったけど、思い出せず、
cakeplusのcheckCompare()を参考に作成。
以下、ソース
<?php /* * 使い方... * * var $validate = array( * 'test' => array( * "rule1" => array('rule' => array('maxWidth', 30), * 'message' => '全角15文字(半角30文字)以内です' * ), * "rule2" => array('rule' => array('phoneJP'), * 'message' => '電話番号ではありません' * ), * "rule3" => array('rule' => array('checkDuplicates'), * 'message' => 'この値は既に使用されています' * ), * "rule4" => array('rule' => array('checkEither', 'test2'), * 'message' => 'testフィールドまたはtest2フィールドのどちらかに入力して下さい' * ), * ), * ); */ class MyValidationRuleBehavior extends ModelBehavior { function setup(&$model, $config = array()) { //$this->settings = $config; mb_internal_encoding('UTF-8'); } /** * 文字数を表示幅でチェック(全角2文字、半角1文字でカウント) * @param array &$model * @param array $wordvalue * @param int $length * @return boolean */ function maxWidth(&$model, $wordvalue, $length) { $value = array_shift( $wordvalue ); return (mb_strwidth($value) <= $length); } /** * 電話番号チェック * @param array &$model * @param array $wordvalue * @return boolean */ function phoneJP(&$model, $wordvalue) { $value = array_shift( $wordvalue ); return preg_match("/^\d{2,4}\-\d{2,4}\-\d{4}$/", $value); } /** * 値の重複チェック * @param array $model * @param array $wordvalue * @return boolean */ function checkDuplicates(&$model, $wordvalue) { $cond = array(key($wordvalue) => array_shift($wordvalue)); $id = $model->getID(); if ($id !== false) { $cond[$model->name.'.id !='] = $id; } return $model->findCount($cond) === 0; } /** * 該当フィールドと指定フィールド、いずれかを必須入力としてチェック * @param array &$model * @param array $wordvalue1 * @param string $fieldname2 * @return boolean */ function checkEither(&$model, $wordvalue1, $fieldname2) { $fieldname1 = key($wordvalue1); return ($model->data[$model->alias][$fieldname1] !='' || $model->data[$model->alias][$fieldname2] !=''); } } ?>
「どっちかのフィールドを必須項目にする」バリデーションの
名前を何にすればいいのか小一時間悩む。
チャットで相談してみると、「AnySides」「Either」でどうでしょう、とアドバイスを頂き、結局checkEither()にした。
最初やけくそで、docchika()という名前にしていたけど、チャットで笑われたw
関数名とか変数名とかクラス名とかファイル名とかテーブル名とかフィールド名とか悩むねぇ。
英語がダメダメだから翻訳サイトで単語を調べてわかっても、文脈というか用途に合っているのか、さっぱりわからん。
他の人(日本人)が書いたソースを見ると、「へぇ〜英語でそう言うんだぁなるほどぉ」と感心するけど、もしかすると、その人も自信無いまま書いてるのかもしれんなぁっと思ったり。
英語圏の人が英語の関数名を見る感覚って、日本人が日本語の関数名を見るのと同じだと想像すると、英語圏の人でも悩むのかもしれんなぁっと思ったり。
命名についての勉強会とかあると面白そうだと思う今日この頃。