amazonバナー

2012年2月23日木曜日

CodeIgniterのPaginationクラスのハマリどころ2

Controller側の処理については前回の分でお話しました。

今回はView側のお話。

検索画面を想定した場合、検索条件を指定して検索を行った後、
検索結果画面が表示され、件数が多い場合ページ番号が表示されます。
ではではと2ページ目をクリックして表示すると検索条件がすっ飛びます。

続きはwebで。

結論からいうとそりゃそうなるわけです。
2ページ目のリンクはただのAタグです。
メソッドへ渡されるパラメータはオフセットの数値のみ。

はぁ、じゃー引数に検索条件持たせればいいじゃない。

そんなバカな!検索条件が多大なページだったらURLがとんでもないことになりますし、なんかスマートじゃない。

てことで。

解決方法は色々(セッションを利用する、Paginationクラスを直接いじる)ありますが比較的簡単に出来る方法かなと思うので共有します。

まずは前提として、View側に検索条件のhiddenを持ちます。

<?php echo form_open('フォーム先', array('id' => 'form'));?>

<input type="hidden" name="jouken1" value="<?php echo $jouken1;?>">

<input type="hidden" name="jouken2" value="<?php echo $jouken2;?>">

次にController側のPaginationの設定を追加します。
// Viewで表示した時にこのタグでPagination全体を囲みます
$config['full_tag_open'] = "<div id='pagination'>";
$config['full_tag_close'] = "</div>";

最後にView側にjQueryを追加。
<script type="text/javascript" src="/js/jquery-1.7.1.js"></script>
<script type="text/javascript">
<!--
jQuery(function($){
    // ページネーションのアンカークリックされたらフォームsubmitにするよ
    $('#pagination').find('a').click(function(e) {
        // hrefの制御をキャンセル
        e.preventDefault();
        // フォーム先を指定
        $('#form').attr('action', e.target.href);
        // Submit
        $('#form').submit();
    });
});
//-->
</script>
こうすることで、Paginationで生成したAタグのリンクをクリックすると
hrefの遷移をキャンセルして遷移先にPOSTすることになります。

Controller側の書き方によりますが、POSTして受け取った値を使って
クエリ条件を生成して実行していた場合に、条件を引き継いでページ遷移が出来るようになります。

セッションでやればいいんでしょうけど、セッションで持つのはなんかなぁ…て思う場合はいい方法かな、と思います。

0 件のコメント:

コメントを投稿