PEAR::HTML_QuickForm_Controllerをmod_rewrite環境で利用する場合の注意点

ちょっとマニアックなテーマですが…。 PEARで便利なパッケージにHTML_QuickForm_Controllerがあります。 お問い合わせなどのフォームを入力画面~確認画面~完了画面までの流れを簡単に作ってくれるパッケージですね。

このパッケージを.htaccessなどを利用してmod_rewriteでURL書き換えを行なう際にハマってしまう落とし穴があるので、その注意点と解決法をお話します。

mod_rewriteで書き換えると、PHP_SELFも変わる

.htaccessで例えばお問い合わせフォームをカテゴリー別に用意しているように見せかけるとしましょう。

RewriteEngine On
RewriteRule ^inquiry/(.+)/ /inquiry/form.php?category=$1& [L,QSA]
#QSAは「クエリーをそのまま付加する」というオプションです。

このように記述して「http://colori.jp/inquiry/trouble/」にアクセスしたとしましょう。

すると、$_SERVER[‘PHP_SELF’」の値がどうなるかというと、「/inquery/trouble/」ではなく「/inquiry/form.php」になってしまうのです!

HTML_QuickForm_ControllerはPHP_SELFで勝手にリダイレクトする

さて、この仕様のままHTML_QuickForm_Controllerを使うとどうなるでしょう?

実は、HTML_QuickForm_Controllerは、フォームの内容をチェックしたあと、OKであればPHP_SELFに「_qf_confirm_display=true」というクエリを付加してリダイレクトしてしまうのです。

そのため、こちらとしては「http://colori.jp/inquiry/trouble/?_qf_confirm_display=true」を確認画面にしたかったにも関わらず「http://colori.jp/inquiry/form.php?_qf_confirm_display=true」がURL欄に表示されてしまうのです。

じゃ、どうすればいい?

解決策は、$_SERVER[‘PHP_SELF’]をform.phpの中で、しかもHTML_QuickForm_Controllerに利用される前に書き換えてしまうことです。

例えば今回のように、mod_rewrite書き換え時にカテゴリー名を「category」というクエリに設定した場合だと、次のような処理を最初のほうに書いておくことで解決することができます。

//お問い合わせの種類は「trouble」「product」「order」を用意しているとします
if (in_array($_GET['category'], array('trouble','product','order')) {
$category = $_GET['category'];
$_SERVER['PHP_SELF'] = "/inquiry/$category/";
} else {
print('パラメーターが不正です。');
exit;
}

PEARなどのライブラリやフレームワークを利用すると、このようにブラックボックス化されたところで思わぬエラーに遭遇することがありますので、注意しましょうね。

フォームの送信先を好きなURLに設定したい場合はこちらの記事もどうぞ!「PEAR::HTML_QuickForm_Controllerで途中で送信先URLを変更する方法(action)

このページをシェアする

コメントを残す

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

2011-01-05