これは、ここ数年私を悩ませてきたものです-JoomlaはJRequestを提供し、次にJInputが着信リクエストからフィルタリングされたデータにアクセスするために提供しました。フィルタリングされた文字列、整数、単語などを要求できます。または、配列を要求することもできます(変数名のみでgetVarを使用し、返された値が配列であることを想定/確認するか、またはそれにいくつかの追加のパラメーター)。
しかし、整数や単語などの配列を要求することはできません。
何か不足していますか?
たとえば、my POSTデータには以下が含まれる可能性があります。
stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>
JInputに整数の配列として「もの」を要求するにはどうすればよいですか?
では、利用可能なオプションを見てみましょう。以下の例はJInputを使用しており、Joomla 3.3でテストされています。
私は次のデータを投稿しています Joomlaで:
stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>
きれいな整数の配列を取得したい期待される結果は:
$expectedResult = array(
'abc' => 1,
'def' => 75,
'123' => 0,
);
$a1 = $app->input->get('stuff', array(), 'ARRAY');
結果:
array (size=3)
'abc' => string '1' (length=1)
'def' => string '75' (length=2)
123 => string '<script src="http://imanaughtysite.com/muahahaha.js"/>' (length=54)
悪い考え-ご覧のように、データを取得していますが、まったくフィルタリング/クリーンアップされていません!
$a2 = $app->input->post->getArray();
結果:
array (size=1)
'stuff' =>
array (size=3)
'abc' => string '1' (length=1)
'def' => string '75' (length=2)
123 => string '' (length=0)
これで、POST配列全体がクリーンアップされました。しかし、これは必要な情報であり、整数の配列ではありません。
$a3 = $app->input->getArray(array(
'stuff' => array(
'abc' => 'INT',
'def' => 'INT',
'123' => 'INT'
)
));
結果:
array (size=1)
'stuff' =>
array (size=3)
'abc' => int 1
'def' => int 75
123 => int 0
これは実際に必要なものを提供する最初のバージョンです。フィルターを個別に指定して結果を取得できます。 stuff
は、結果の配列からPHP関数array_values
値だけを抽出して、キーをリセットすることもできます。
オプション3はうまくいくかもしれませんが、いくつかの問題があります。
この問題を解決するには、より多くのステップでそれを行う必要があります。
// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');
// Pre-filling all parameters with the INT filter.
$a4 = $app->input->getArray(array(
'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
));
結果は次のとおりです。
array (size=1)
'stuff' =>
array (size=4)
'abc' => int 1
'def' => int 75
123 => int 0
キーが必要な場合にセキュリティ上の問題が発生する可能性があります:キーではなく値をフィルタリングしています!
いくつかの簡単な処理:
$finalArray = array_values($a4['stuff']);
array (size=4)
0 => int 1
1 => int 75
2 => int 0
ANSWER IS HERE:-> a POST request(ideally fitこれをメソッドに入れます):
// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');
// Check to see if array is empty.
if (! empty($unfilteredData))
{
$a4 = $app->input->getArray(array(
'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
));
$result = array_values($a4['stuff']);
}
else
{
$result = array();
}
Joomlaはフィルターとして複数のタイプをサポートしていません。
これは、JRequestまたはJInputを使用して行うことはできません。
Joomlaで利用できる回避策は今のところありません。コード内でのみ複数のフィルターを処理する必要があります。
あなたは間違いなく何かを見逃していません。これを定期的に行っている場合は、システムプラグインを作成して、既存のJRequestクラスを拡張し、それに新しいフィルタータイプを追加できます。