タイトルなんて言えばいいんだ・・・
ユーザから入力された値を元にDBから値を取得し、ページネーションでページ遷移する場合。
通常だと1ページ目しか、ユーザから入力された値が変数に格納されていないため、2ページ以降は「変数がありません」とエラーが出る。
そんな場合は GETを使って値を次のページへ渡していけばいい。
ページネーションについては過去にブログで書いたことがある(FuelPHP1.7のページネーション[FuelPHP入門])。
・・・が、今回のことで全然理解していなかったことが発覚。恥ずかしい。
1.GETを使う目的
今回の目的、やりたいこと。
ユーザ入力値を元にページネーションしたい。
1. ページネーションを作ってて、ユーザ入力値が最初のページにしか保存できてない。
→ ページごとじゃなく最初の1回だけDBへアクセスして、配列にでも格納して、ページごとに必要な値取得したらいいんでね?
→ 難しそう。
2. ページが変わっても、ユーザ入力値を保持したい。
→ 最初POSTを使うもうまくいかない。
→ GETは使えるらしい。
ということで、2を採用。
ページネーションで GETを使う。
GETを使うには、ページネーションでクエリ文字列を有効にしないといけない。
通常のページネーションの形はこう。
http://example.com/articles/page/2
クエリ文字列を使うとこうなる。
http://example.com/articles/?page=2
さらにGETを使うことこうなるイメージ。
http://example.com/articles/?search=hoge&page=2
クエリ文字列によるページネーションは、GETを使うための機能なのか。
2.GETを使うための設定
まず、クエリ文字列を使えるようにしよう。
公式ドキュメントを参考に。$configの部分を修正。
$config = array( 'pagination_url' => 'http://localhost/fuel/welcome/index/', 'total_items' => 10, 'per_page' => 5, 'uri_segment' => 3, // もしくは、クエリ文字列によるページネーションがよいのであれば 'uri_segment' => 'page', //ここのコメントアウトをはずす。 );
公式ドキュメントでは「’uri_segment’」の行がコメントアウトされていたが、このコメントアウトを削除。
これだけでクエリ文字列を使えるようになる。
Controllerには $_GETを受け取るInput()クラス、そのユーザ入力値を元にデータを取得するDBを書く。
$search = Input::get('search'); $data['example_data'] = DB::select('id', 'value') ->from('pagination') ->where('value', $search) //こんな感じ ->limit($pagination->per_page) ->offset($pagination->offset) ->execute() ->as_array();
limitに1ページで表示する数を指定、offsetに何番目からとってくるかを指定している。
この offsetがちょっと理解不足。
勉強する。
参考
Pagination – クラス – FuelPHP ドキュメント
FuelPHP のクエリ文字列でのページネーション – A Day in Serenity @ kenjis
ErogameScape -エロゲー批評空間- Blog : FuelPHP1.5のpaginationにQuery Stringによるページネーションが追加されています
コメント
Learning a ton from these neat arslicet.