pagination
Select2 は、 から出てくるキーを介してリモート データを使用する場合のページネーションをサポートしprocessResults
ます。
無限スクロールの場合、オブジェクトはブール値 (または) のプロパティをpagination
持つことが期待されます。これにより、Select2 は、最下部に達したときにさらに結果をロードする必要があるかどうか、または結果の最後に達したかどうかがわかります。more
true
false
{
results: [array, of, results],
pagination: {
more: true
}
}
あなたの場合、結果を形作る能力があります。したがって、JSON 応答を実際に変更して、期待される形式に一致させることができます。つまり、.xml を使用する必要さえありませんprocessResults
。
page
Select2 は、関数を変更しajax.data
て返すようにページ番号を渡すことができます。
data: function(params) {
return {
term: params.term || "",
page: params.page || 1
}
},
そして、 を使用してページを取得できるようになりますInput::get('page')
。(page - 1) * resultCount
また、resultCount
を使用してスキップする結果の総数を計算でき25
ます。これにより、クエリを変更して結合LIMIT
し、OFFSET
必要な結果だけを取得できます。
$page = Input::get('page');
$resultCount = 25;
$offset = ($page - 1) * $resultCount;
LIMIT
また、次のクエリを使用して/クエリを生成できOFFSET
ます (このスタック オーバーフローの質問.
$breeds = Breed::where('name', 'LIKE', '%' . Input::get("term"). '%')->orderBy('name')->skip($offset)->take($resultCount)->get(['id',DB::raw('name as text')]);
したがって$breeds
、要求された結果のみが含まれます。残された唯一のことは、Select2 が期待する方法に一致するように応答を形成することです。結果の合計数を確認し、制限を超えていないかどうかを確認することで、さらにページがあるかどうかを判断できます。
$count = Breed::count();
$endCount = $offset + $resultCount;
$morePages = $endCount > $count;
これ$morePages
はまさに Select2 が で探しているものですpagination.more
。ここで必要なのは、前述の形式に一致するように応答を整形することだけです。
$results = array(
"results" => $breeds,
"pagination" => array(
"more" => $morePages
)
);
そしてそれをレンダリングする
return response()->json($results);
すべてをまとめると、JavaScript の場合は次のようになります
$("#breed_id").select2({
placeholder: 'Breed...',
width: '350px',
allowClear: true,
ajax: {
url: '',
dataType: 'json',
data: function(params) {
return {
term: params.term || '',
page: params.page || 1
}
},
cache: true
}
});
そして、あなたのコントローラのための以下
if ($request->ajax())
{
$page = Input::get('page');
$resultCount = 25;
$offset = ($page - 1) * $resultCount;
$breeds = Breed::where('name', 'LIKE', '%' . Input::get("term"). '%')->orderBy('name')->skip($offset)->take($resultCount)->get(['id',DB::raw('name as text')]);
$count = Breed::count();
$endCount = $offset + $resultCount;
$morePages = $endCount > $count;
$results = array(
"results" => $breeds,
"pagination" => array(
"more" => $morePages
)
);
return response()->json($results);
}