出力をカスタマイズする

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)する際に、上記で定義した[新たな部品名]で呼び出せばカスタム表記した部品を表示することができる。

7件のコメント

  1. 磨者(MAAKIKAKU)BLOG :

    HTML_QuickForm の出力をカスタマイズ

    HTML_QuickForm は確認画面用の出力まで自動でやってくれる。便利です…

  2. こぶち :

    タグの後ろに任意の文字列を表示する方法を模索しております。表示する文字列は各要素の補足説明で、要素ごとに異なります。
    既存のフォーム部品用classを拡張したカスタムクラスを生成する方法で対応できますでしょうか?

  3. admin :

    既存クラスの拡張でできるかどうか、と言われれば「できると思います」という回答になります。具体的に何をされたいのかわからないのでなんとも言えませんが。

  4. こぶち :

    タグの後ろに任意の文字列(入力内容の補足説明)を表示したいのですが、それぞれの入力項目で説明文が異なりますので、どのように実装するか模索しています。
    addElement の引数にカスタム要素を追加して、レンダラーにsetElementTemplateでプレースフォルダを追加できれば、一番効率が良いと思うのですが、そこまでの技術はありません(泣

    既存クラスの拡張で勉強します。ありがとうございました。

  5. かおるん :

    ブログオーナーです(名前設定してなかったので、設定しなおしました)。
    とりあえず頑張ってください。
    現状QuickFormは旧来のバージョン(HTML_QuickForm)と現在開発中のバージョン(HTML_QuickForm2:アルファ版)があります。どちらで開発していらっっしゃるのかわかりませんが、公式サイトを見る限りは、旧バージョンの使用は推奨されていません。しかし新バージョンはまだアルファ版で、将来的に仕様の変更がなされる可能性があります。
    過渡期ですのでしょうがないところではありますが、考慮されて開発されたほうがよろしいかと存じます。
    ご発注いただければ・・・とも思いましたが。まずはご自身でがんばられるのがよいかと思います。

  6. こぶち :

    HTML_QuickForm_Renderer_Default を拡張しようと読み解いていいたところ、標準で複数ラベルに対応していました。
    setElementTemplate で{label_2}との追記で対応できました。
    表示したい文字列は、addElement で追記でき、全ての要素に対応できるので、結果的にベストな結果になりました。
    ご指導、ありがとうございました。

    HTML_QuickForm2はアルファ版なので、HTML_QuickFormを使用しています。今はホント過渡期ですよね。

  7. かおるん :

    ご報告ありがとうございます。お役に立てなくてすみません。
    QuickForm2は実用上それほど問題もなさそうだったので、業務で試しましたが、使い勝手が変わっていたり、ライブラリが充実していなかったり、という状態でした。ちなみに私は、現状はほとんどPEARを使用していません。PHP5完全対応になったら試そうかとも思っていますが、その頃にはPHP6がリリースされていそうで・・・。

コメントを残す


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