Ethna で携帯サイトを開発していて、キャリアによってフォームから
入力される文字列の文字コードが SJIS の場合と UTF-8 の場合があり、
max(文字列の長さ) の validate で、それぞれの文字コードの strlen()
の結果が違うのでうまくいきませんでした。
文字コードを統一してから validate すれば良いのですが、
そうもできない事情があり、validate plugin を作成してみました。
SJIS か UTF-8 が入力される $nickname の validate の場合に
ActionForm で以下のように定義します。
validate の条件は半角で8文字、全角で4文字以下の場合。
var $form = array( 'nickname' => array( 'type' => VAR_TYPE_STRING, 'form_type' => FORM_TYPE_TEXT, 'name' => 'ニックネーム', 'required' => true, 'utf8max' => array( 'utf8max' => true, 'max' => 8), ), ); |
そして、以下のような Validate Plugin を作成しました。
example/app/plugin/Validate/Example_Plugin_Validator_Utf8max.php
<?php class Example_Plugin_Validator_Utf8max extends Ethna_Plugin_Validator { function &validate($name, $var, $params) { $true = true; $type = $this->getFormType($name); if (isset($params['utf8max']) == false || $this->isEmpty($var, $type)) { return $true; } $encode に文字列の文字コードが入っている if ($encode == 'UTF-8') { if (mb_strwidth($var, 'UTF-8') > $params['max']) { $msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい"; return Ethna::raiseNotice($msg, E_FORM_MAX_STRING, array(intval($params['max']/2), $params['max'])); } } else { if (strlen($var) > $params['max']) { $msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい"; return Ethna::raiseNotice($msg, E_FORM_MAX_STRING, array(intval($params['max']/2), $params['max'])); } } } } ?> |
意図する validate ができましたが、もっともっと良い方法があると思います。
皆さんはどうやっているのでしょうか…?