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

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()がおすすめですね。

このページをシェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

2010-12-22