PEAR::HTML_QuickFormと空要素その1

初めて使うには複雑過ぎる、でも慣れると便利なQuickFormについてです。
基本的な使い方はわかっているという前提で書いていきます。


QuickFormで入力フォームを作ると「<input />」と出力されて
コーダーの人から「このページはXHTMLじゃないから空要素のスラッシュ外してね」
とか言われたことありませんか?私はあります。

最初はSmartyの置換でやっつけていたけど、自分以外も触るテンプレート(View)できるだけシンプルにしたいです。
となるとQuickFormの方を何とかするのが手っ取り早いでしょう。

結論を言うと「registerElementType」を使います。
一番シンプルなtype="text"について説明していきます。

$form = new HTML_QuickForm('hoge');
$form->registerElementType('extext', CLASS_PATH . 'QuickForm/ExtendText.php', 'Extendtext');
$form->addElement('extext', 'foo', 'bar', array('maxlength' => '10',));

こんな感じで新しいElementTypeの「extext」を登録します。
ファイル名を見たら判るとおりtextの継承です。
「ExtendText.php」を書く前に元のファイルの「HTML/QuickForm/text.php」を見てみましょう。
・・・
ここでタグを吐き出してるわけじゃないみたいですね。

class HTML_QuickForm_text extends HTML_QuickForm_input

となっているので続いて「HTML/QuickForm/input.php」を見ましょう。

    function toHtml()
    {
        if ($this->_flagFrozen) {
            return $this->getFrozenHtml();
        } else {
            return $this->_getTabs() . '<input' . $this->_getAttrString($this->_attributes) . ' />';
        }
    } //end func toHtml

まさにこの部分ですね。
このファイルを書き換えてもいいんですが他のシステムでも使うことを考えればPEARを直接触るのは避けたいところ
コピーしておきましょう。


ExtendText.php

require_once "HTML/QuickForm/text.php";

class ExtendText extends HTML_QuickForm_text
{
    function toHtml()
    {
        if ($this->_flagFrozen) {
            return $this->getFrozenHtml();
        } else {
            return $this->_getTabs() . '<input' . $this->_getAttrString($this->_attributes) . ' >';
        }
    }
}

これで出力が「<input type="text" >」となります。
本当はまだやることがあるんですが長くなるのでエントリー2つにわけます。