$mainframe->getUserStateFromRequest()

 Joomla! for 1.5.x

 リクエストパラメータを取得しつつ、かつ特定のキーでセッションに保存するときに便利。

 良く使われているのがリストのページング。

$limitstart = $mainframe->getUserStateFromRequest(
	"{$option}.list.limitstart"
	, 'limitstart'
	, 0
	, 'int'
	);
$limit = $mainframe->getUserStateFromRequest(
	"global.list.limit"
	, 'limit'
	, 30
	, 'int'
	);
@param string
セッションに保存するときのキー。ドット(.) で階層区切り。limit に使用している global.list.limit はシステム全体で利用されているキー。
@param string
リクエストパラメータのキー。POST か GET で同名の値を受け取ると、その値を取得しつつ該当のセッションを書き換える。
@param mixed
値が指定されなかった場合のデフォルト値。
@param string
データ型。JRequest::getVar() を参照のこと。

 フォームの入力内容を保持するのにも利用できる。たとえば確認画面を表示したり、入力エラーでフォームを再表示したり、いったん内容をセッションに保持しておきたいときなどに、状況にしばられずに一定のインターフェースで値を取得できる。

$name = $mainframe->getUserStateFromRequest("{$option}.list.name", 'name', 0, 'string');
$email = $mainframe->getUserStateFromRequest("{$option}.list.form", 'email', 0, 'string');

 ただ一点問題がある。

 この関数はリクエストパラメータの取得に JRequest::getVar() を利用しているのだが、この関数は特に指定しない限り値をフィルタリング(マスク)して返す。

 たとえば値に "Hoge " のような HTML と判断される内容が含まれていると、その部分を削除して "Hoge" とだけ返す。

 一応、回避策として第5引数にある定数でフィルタ(マスク)指定をすると対応できる。*1

$email = JRequest::getVar('email', $default, $request_type, $data_type, JREQUEST_ALLOWRAW);
JREQUEST_NOTRIM
trim しない
JREQUEST_ALLOWRAW
フィルタリング(マスク)しない
JREQUEST_ALLOWHTML
安全(?) なHTML のみ許可

 問題は getUserStateFromRequest() がこのフィルタ(マスク)指定をアダプトしてくれないということ。

 だから手前ブログみたいに 入力にHTML を許可する仕様を組みたい場合は、これが使えない。

 んじゃーどうすっかというと。

$text = JRequest::getString(
	'text'
	, $mainframe->getUserState("{$option}.form.text")
	, 'post'
	, JREQUEST_ALLOWRAW
	);
$mainframe->setUserState("{$option}.form.text", $text);

 少々面倒だが、自分でセッション管理をするよりはまだマシだろう。

*1:詳しくは libraries/joomla/environment/request.php