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