getで送信されたパラメータを引き継ぐpaginationのやり方
cakephp1.2RC2の環境を前提にしています。
例えば下記のように、
http://hogehoge.com/hoge/index/id1234
GETでid1234というパラメータ値を渡してそれを検索条件にしているような場合、viewのファイルに下記の1文を記述すればpaginationのURLにもパラメータが引き継がれます。
追記
紛らわしい書き方したみたいですみません。GETで送信されたというのは、フォームからのGETリクエストではなく、URLのリンクの中のパラメータという意味です。例えば、複数のショップの各月の売り上げ一覧画面があるとして、その一覧から特定ショップの各月の売り上げだけを見たいという場合に、一覧画面でショップ名の箇所などに特定ショップのショップIDをURLに含ませたリンク(invoice/index/shop123)を作成し、そこから遷移するようなものを下記の説明では想定してます。(bakeで作った画面で、editやviewへのリンクが/hoge/edit/2とかってなってますよね?そういったイメージです)
<?php $paginator->options(array('url' => $this->passedArgs)); ?>
上記の1文を書くと、$paginator->nextの箇所のURLは下記のように展開されます。
http://hogehoge.com/hoge/index/id1234/page:2
追記
passedArgsは、URLクエリの情報が格納されている配列なのですが、上記のようにそのまま渡してしまうと文字列がエスケープされないので、XSSの問題が発生します。事前にURLencodeするか、下記の記事を見てパッチを当ててください。
http://d.hatena.ne.jp/cakephper/20090226
下記に、これを使ったサンプルのコントローラとviewを記載します。
app/controllers/invoices_controller.php
<?php class InvoicesController extends AppController { var $name = 'Invoices'; var $helpers = array('Html', 'Form', 'paginator'); function index( $shopid = null ) { $this->Invoice->recursive = 0; if( !empty($shopid) ){ $condition = array( "shopid" => $shopid ); } $this->set('invoices', $this->paginate( $condition )); } }
viewは下記のファイルになります。
app/views/Invoices/index.ctp
<?php echo $paginator->counter(array( 'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) )); ?></p> <?php $paginator->options(array('url' => $this->passedArgs)); ?> <table cellpadding="0" cellspacing="0"> <tr> <th><?php echo $paginator->sort('id');?></th> <th><?php echo $paginator->sort('ショップID','shopid');?></th> <th class="actions"><?php __('Actions');?></th> </tr> <?php foreach ($invoices as $invoice): ?> <tr> <td> <?php echo $invoice['Invoice']['id']; ?> </td> <td> <?php echo h( $invoice['Invoice']['shopid'] ); ?> </td> <td class="actions"> <?php echo $html->link(__('詳細', true), array('action'=>'view', $invoice['Invoice']['id'])); ?> </td> </tr> <?php endforeach; ?> </table> </div> <div class="paging"> <?php echo $paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?> | <?php echo $paginator->numbers();?> <?php echo $paginator->next(__('next', true).' >>', array(), null, array('class'=>'disabled'));?> </div>