独自のバリデーション関数を追加(日本語の文字数チェック)

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