独自のバリデーション関数を追加(日本語の文字数チェック)
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