以前に「チェックボックス、複数セレクトボックスを使った検索のロジック」という記事をエントリーしました。
チェックボックス、複数セレクトボックスを使った検索のロジック
この次によくつまずくのが、ページネーションにこの検索結果(配列)を持ち回りさせるテクニックです。
テキストフィールドやラジオボタン、セレクトボックスなどの変数で受け取れるページネーションの持ち回りは簡単。
だけど、チェックボックスや複数選択できるセレクトボックスなどは配列で受け取るので、ページネーションにどうやって持ち回りさせるかよく迷ったりします。
今回は「チェックボックスなどによる複数検索結果をページネーションに持ち回りさせるテクニック」についてエントリーします。
まずは View に記述するページネーションです。
HTML
:
<!-- ページネーション -->
<div class="text-center">{!! $filters->appends($paramarray)->fragment('anchor')->links() !!}</div>
ここでのポイントは appends メソッド。
ページネーションにクエリ文字列を付け加えたいときは、appends メソッドを使います。
appends メソッドの引数には sort=votes のように連想配列を指定してあげます。
{{ $users->appends(['sort' => 'votes'])->links() }}
ページネーションのURLに「ハッシュフラグメント」を追加したい場合は、fragment メソッドが使用できます。
例えば各ページネーションリンクの最後に #foo を追加したい場合は、以下のように fragment メソッドを呼び出します。
{{ $users->fragment('foo')->links() }}
それでは appends メソッドの引数に指定した $paramarray をコントローラで定義していきましょう。
コントローラ
ビューへは以下のようにwithメソッドを使って渡してあげます。
paramarray() は関数にしてコントローラの末尾に定義してあげます。
:
// ビューへ渡す値を連想配列として格納
$hash = array(
'paramarray' => $this->paramarray($request),
'users' => $users,
);
return view('user.user_list')->with($hash);
}
コントローラ(関数定義)
paramarray の関数を作成します。
処理としては $request->input で配列として受け取った配列の値を foreach を使ってひとつずつ取り出してあげます。
/**
* ページネーションのパラメーター(関数)
*/
private function paramarray($request)
{
// 宣言
$tmp = array();
// セレクトボックス(単一)
if($request->input('pref')){
$tmp = $tmp + array('pref' => $request->input('pref'));
}
// セレクトボックス(複数)
// チェックボックスなど
if(is_array($request->input('prefs'))){
$arr = array();
foreach($request->input('prefs') as $param){
$arr[] = $param;
}
$tmp = $tmp + array('prefs' => $arr);
}
return $tmp;
}
これで、チェックボックスや複数セレクトボックスで複数選択した項目(配列)をページネーションに持ち回すことが可能です。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。