[PHP-users 24497] Re: QuickForm のレンダラの利用について

榮水貴行 t-eimizu @ aim.ac
2005年 2月 11日 (金) 18:12:02 JST


お世話になります。榮水です。

長文で失礼致します。

>しかし、レンダラを利用するとaddRuleメソッドで
>定義した、エラーチェックの動きがおかしくなって
>しましました。動作がおかしくなる部分として、

これは、レンダラを利用したためと言うよりも、
これまでにも存在したバグが、他が正常に動作するように
なったために顕在化したと捉えるべきでしょう。

>$form->addRule( "nick_name", "ニックネームは全角で1から10
>文字までです。", "rangelength", array(1,20), "client");

上で使用しているrangelengthというルールは、
結局のところ以下のようなロジックです。
(正確なものはHTML/QuickForm/Rule/Range.phpを参照)

$value = '画面で入れた文字列'
$options = array(1,20);
$length = strlen($value);
return ($length >= $options[0] && $length <= $options[1]);

これを見る限り、画面で入れた文字列がそのまま渡っていれば、
チェックがおかしくなるということは考えにくいです。

画面で入れた文字列がそのまま渡らないケースを考えると、
HTM_QuickFormにはフィルタという機能がありました。

ハヤシさんのソースを見ると、
$form->applyFilter('__ALL__','trim');
$form->applyFilter('__ALL__','htmlentities');
$form->applyFilter('__ALL__','addslashes');
$form->applyFilter('__ALL__','escapeshellcmd');
と四つのフィルタが全ての要素について適用されています。

このフィルタを通過するとどうなるでしょう。
以下のソースを実行してみてください。

<?php
$test = "   あいう   ";
echo "$test<br/>";
$test = trim($test);
echo "$test<br/>";
$test = htmlentities($test);
echo "$test<br/>";
$test = addslashes($test);
echo "$test<br/>";
$test = escapeshellcmd($test);
echo "$test<br/>";
?>

つまり、ルールの検証に行く前に、入力された文字列がこれだけ
加工されているということです。これでは長さのチェックなど
無理なのはしごく当然の話でしょう。

どのような目的で入力データを使用するかにもよりますが、
trim以外のフィルタは、この場合不要ではないかと思います。

HTML_QuickFormは確かにソースが難解で、処理を追うのが大変ですが、
対象を限定すれば、一番原始的なレベルでどんなことをしているのか
突き止めるのは、流れを追うよりは簡単だと思います。

かく言う私もHTML_QuickFormは謎の部分が多いので、
(Mojavi + Smarty + HTML_QuickFormでしか使っていないため)
皆さんの質問を題材にして勉強させていただいております。

*=================================*
株式会社エイム
榮水 貴行
Mail: t-eimizu @ aim.ac
*=================================*


PHP-users メーリングリストの案内