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),
),
); |
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']));
}
}
}
}
?> |
<?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 ができましたが、もっともっと良い方法があると思います。
皆さんはどうやっているのでしょうか…?