PEAR::HTML_QuickFormと空要素その2

前回の更新から軽く1月振りの更新です・・・。


それでは前回の続きです。
「<input type="text" >」と入力フォームの空要素タグからスラッシュを外すことができました。
入力フォーム → 完了画面
という流れなら問題ないのでですが、確認画面を挟むことが多いと思います。QuickFormはこの確認画面も簡単に作ることが出来ます。

switch ($mode) {
    case "confirm" :
        if ($form->validate()) {
            $form->freeze();
            confirmPage($form);
        } else {
            inputPage($form);
        }
        break;

このように「freeze()」を使うと出力が「入力内容<input type="hidden" value="入力内容" ... />」という形で出力されます。
便利なのはいいんですが、せっかく外したスラッシュがhiddenに付いてしまっています。

前回見た「HTML/QuickForm/input.php」の「toHtml()」にそれっぽい記述があったので確認してみましょう。

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

「$this->getFrozenHtml();」いかにもといった名前ですね。探してみると・・・1つ遡った「HTML/QuickForm/element.php」にありました。

    function getFrozenHtml()
    {
        $value = $this->getValue();
        return ('' != $value? htmlspecialchars($value): '&nbsp;') .
               $this->_getPersistantData();
    } //end func getFrozenHtml
    
    function _getPersistantData()
    {
        if (!$this->_persistantFreeze) {
            return '';
        } else {
            $id = $this->getAttribute('id');
            return '<input' . $this->_getAttrString(array(
                       'type'  => 'hidden',
                       'name'  => $this->getName(),
                       'value' => $this->getValue()
                   ) + (isset($id)? array('id' => $id): array())) . ' />';
        }
    }

どうやら「_getPersistantData()」でタグを作っているようですね。これも「ExtendText.php」に書き込んで上書きしちゃいましょう。


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) . ' >';
        }
    }

    function _getPersistantData()
    {
        if (!$this->_persistantFreeze) {
            return '';
        } else {
            $id = $this->getAttribute('id');
            return '<input' . $this->_getAttrString(array(
                       'type'  => 'hidden',
                       'name'  => $this->getName(),
                       'value' => $this->getValue()
                   ) + (isset($id)? array('id' => $id): array())) . '>';
        }
    }
}

以上でテキストボックスの空要素タグからスラッシュを削除できました。


おまけです。
QuickFormをXHTML Strictにするためにはformタグのname属性が邪魔になるので以下のようにしてname属性を外しちゃいましょう。

$form = new HTML_QuickForm('hoge');
$form->removeAttribute('name');