別クラスで設定したルールを適用する際に・・・

2006/04/16 | HTML_QuickForm

ここのところ開発は全て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のソースを読んで修正するのもばかばかしいので「こういうものだ」という理解で進めることにした。勝手に関数名を変換してくれるなよ・・・。

出力をカスタマイズする

2006/04/04 | HTML_QuickForm

QuickFormは非常に強力なフォーム作成ライブラリだが、出力するHTMLのカスタマイズは基本的に<input>タグ(もしくは<label>タグなど)の内側だけだ。しかしラジオボタンやチェックボックスなどはテーブル形式に表示するなど美しく整形して表示したいなどのリクエストも多いはず。
これはPHPのMLで話題になった表示をカスタマイズする方法のメモ。やり方としては既存のフォーム部品用classを拡張したカスタムクラスを生成し、そこでtoHTML関数を上書き、新たなフォーム用部品classとして新規登録する手順を踏むことで実現可能だ。以下サンプル(checkboxとラベルを<span>タグで囲む)。

<?php
 require_once(‘HTML/QuickForm/checkbox.php’);
 class myCheckbox extends HTML_QuickForm_checkbox {
  function toHtml()
  {
   if (0 == strlen($this->_text)) {
    $label = ”;
   } elseif ($this->_flagFrozen) {
    $label = $this->_text;
   } else {
    $label = ‘<label for="’ . $this->getAttribute(‘id’) . ‘">’ . $this->_text . ‘</label>';
   }
   return ‘<span>’ . HTML_QuickForm_input::toHtml() . $label . ‘</span>';
 } //end func toHtml
}
?>

上記のようなカスタムクラスを作成し、生成したQuickFormオブジェクトで新規部品として以下のように登録する。

$myForm=& new HTML_QuickForm(‘myForm’,’post’);
$myForm->registerElementType([新たな部品名],[作成したファイルへのパス],[定義したクラス名]);

これで部品を追加(addElement)する際に、上記で定義した[新たな部品名]で呼び出せばカスタム表記した部品を表示することができる。

checkboxの値指定

2006/02/23 | HTML_QuickForm

HTML_QuickFormで普通にcheckboxを作成すると、そのvalue値は全て「1」になる。これを回避するための(value値を指定する)スクリプトは以下の通り($resultがPearDBのクエリの結果の場合)。

$i=0;
$tmpArray=array();
while($row=$result->fetchRow()){
 $tmpCheckBox=& HTML_QuickForm::createElement(‘checkbox’);
 $tmpCheckBox->setName($i);
 $tmpCheckBox->setText($row[‘name’]);
 $tmpCheckBox->updateAttributes(array(‘value’=>$row[‘id’]));
 $tmpArray[]=$tmpCheckBox;
 $i++;
}
$myForm->addGroup($tmpArray,’formCheckBox’,’CheckBox’,’ ‘);

これでvalue値を任意のものにできる。

Read the rest of this entry »

passwordエレメントのデータ持ち回り

2006/01/06 | HTML_QuickForm

QuickFormで「入力-確認-処理」の一連の流れを簡単に作ることができるけど、passwordについてはhiddenで持ち回りすることは標準でできない。以下のようにプロパティを設定してあげる必要がある。
—————————————————
$myForm=new HTML_QuickForm(‘myForm’,’post’);
$myPassword=& $myForm->addElement(‘password’,userPswd,’パスワード’);
$myPassword->setPersistantFreeze(true);


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net