PEAR::HTML_QuickForm_Controllerで途中で送信先URLを変更する方法(action)

presented by 役に立つかもしれないBlog

PHPでフォーム作成に便利な「HTML_QuickForm」ですが、「HTML_QuickForm_Controller」や「HTML_QuickForm_Page」などでどうしても別ページのURLに内容を変更したい場合のやり方です。

検索してもどこにも載っていなかったので、けっこう貴重かもしれないですよ!

きっかけは私が作っているページのフォームがあるのですが、ここではHTML_QuickForm_Controller + HTML_QuickForm_Page の組み合わせでSmartyを使ってフォームを作成するものでした。

で、「HTML_QuickForm」であれば、インスタンス化する際の3番目のパラメータに文字列で指定してあげると簡単です。

$ctrl = new HTML_QuickForm_Controller("my-form", "post", "http://...");

ところが「HTML_QuickForm_Page」で入力ページや確認ページごとに変えたい場合となると全くやり方が異なります。

「/usr/share/pear/HTML/QuickForm/Page.php」を開いてコンストラクタを見るとこうなってます。

function HTML_QuickForm_Page($formName, $method = 'post', $target = '', $attributes = null)
{
        $this->HTML_QuickForm($formName, $method, '', $target, $attributes);
}

おい...、3番目の$actionパラメータが強制的に空文字になってるよ...

つまり、HTML_QuickForm_Pageのコンストラクタでは送信先の指定ができないのです。

その代わりに使えるのがHTML_Commonクラスから継承されているupdateAttributes()関数です。 これを利用すると、途中でpostをgetに変えたり、フォームのid名やclass名、そしてactionのURLを変更することができます。

/**
     * Updates the passed attributes without changing the other existing attributes
     * @param    mixed   $attributes     Either a typical HTML attribute string or an associative array
     * @access   public
     */
    function updateAttributes($attributes)
    {
        $this->_updateAttrArray($this->_attributes, $this->_parseAttributes($attributes));
    }

使い方は簡単。 HTML_QuickForm_Pageクラスを継承した独自クラスのbuildForm()関数の中で以下のように指定します。

class InputPage extends HTML_QuickForm_Page {

	function buildForm() {
		$this->_formBuilt = true;
		
		$this->updateAttributes(array('action'=>'http://...'));

		...(その他の処理)...
	}
}

他にもsetAttributes()関数があるのですが、これは属性を全て指定しないといけないので、どちらかというとupdateAttributes()がおすすめですね。

    このエントリーをはてなブックマークに追加

このページに関連のある記事はこちら

コメントフォーム