独自のバリデーション関数を追加(日本語の文字数チェック)
cakePHP1.2rc2を使ってますが、標準のバリデーションでmaxlengthを使って文字数チェックをしようとすると、日本語に対応していないのでバイト数をカウントしてしまいます。(例えば、「あああ」だったら9文字とカウント(UTF8))
そこで、日本語の文字数をカウントしてバリデーションする関数を作成します。
バリデーションルールを記載しているモデルファイルに書いても良いですが、該当モデル以外でも汎用的に利用したかったため、今回はapp_model.phpに記載して各モデルのバリデーションルールから呼び出せるようにしました。
まず、app/app_model.phpを作り(cake/app_model.phpからコピーするだけ)、そこに下記の記述を追加。
class AppModel extends Model {
//日本語の文字数チェック関数
function maxLengthJP($wordvalue, $length) {
//$wordvalueはキーがモデル名の連想配列のためforeachで対応
//foreach ($wordvalue as $key => $value){
// return(mb_strlen($value,mb_detect_encoding($value)) <= $length);
//}
//上記よりも、こっちのほうがいいかな。結果は同じだけど。
$value = array_shift( $wordvalue );
return(mb_strlen($value,mb_detect_encoding($value)) <= $length);
}
}
これで、実際のモデルファイルの方にバリデーションチェックを下記のように書けば、指定文字数より大きい文字数の場合にエラーにしてくれます。
var $validate = array(
'companyname' => array(
"rule1" => array('rule' => array('maxLengthJP','100'),
'message' => '会社名は100文字以内です'
),
),
)
ちなみに、function maxLengthJP($wordvalue, $length)の$wordvalueには、下記のような連想配列が渡されます。
Array
(
[companyname] => ほげほげ
)参考URL
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1081&forum=6&post_id=2178