別クラスで設定したルールを適用する際に・・・
ここのところ開発は全てmojavi + QuickForm + Smarty。単独で稼動させるスクリプトは素で書くけれど、「ウェブサイト構築」という名目で作る場合はこの組み合わせ。今まで(自作のライブラリ)よりも作業効率が5倍くらいよくなってるような気がする。
で、お題の件。基本的にmojaviでQuickFormを使う場合は専用のライブラリ(class)を作ってそれを継承し、利用している。フォームで使用するルール(入力規則)はだいたい同じようなものをサイト内で使いまわすけれど、ベースとなるクラスファイルを編集するのは美しくないような気がして、別ファイルでクラス化し、そちらを編集するようにしたかったのだが、そこで問題が発生。別ファイルで定義したルールがなぜか使用できない・・・。
独自ルールを追加するのは前にも書いたregisterRuleでできるはずなのに・・・。
$myForm->registerRule(‘ルール名’,’callback’,’使用する関数名’,’クラス名’);
で確かに登録したし、getRegisteredRules()で確かにルールが登録されていることも確認できるのに・・・。実はすごい落とし穴があった。
ルールの関数はこんなふうにつくった。
–(1)
function _customRule($values,$option){
//ルール詳細
}
ルールの登録はこんなふうに一括でできるように繰り返し処理を利用した。
–(2)
$funcArray=get_class_methods(‘QuickFormRules’);
foreach($funcArray as $funcName){
$ruleName=substr($funcName,1);
$myForm->registerRule($ruleName,’function’,$funcName,’QuickFormRules’);
}
登録したルールをこんなふうに呼び出した。
–(3)
$myForm->addRule(‘formItem’,’Error’,’customRule’);
これで「うまくいくはず!」と思っていたけどダメダメ。いろいろ思案してみてわかったことは・・・get_class_methods関数に問題がありました。これって「関数名を全て小文字で返す」らしい。だから希望として、ルールの名前は「customRule」としたかったのに「customrule」という名前で登録されているということ。ということで(3)をこんなふうに書き換えたら動いた。
–(3)’
$myForm->addRule(‘formItem’,’Error’,’customrule’);
「r」を大文字から小文字に変えただけ。PHPのソースを読んで修正するのもばかばかしいので「こういうものだ」という理解で進めることにした。勝手に関数名を変換してくれるなよ・・・。