2011/05/31

CakePHP で get 送信されたパラメータを引き継ぐ pagination のやり方

検索フォームは昔から method="get" と決まってる(独断と偏見)
CakePHP の場合ページングには PaginatorHelper を使って行います。
GETパラメータをうまく引き継ぐ方法がわからないので、
一応こうやってみたというもの。
うまい方法あれば教えていただきたい。

CakePHP は 1.3.9 です。


検索フォーム
<form action="/index/index/" method="get">
  <div>
    <input type="text" name="q" value="<?php echo h($q)?>">
    <input type="submit" value="検索">
  </div>
</form>

IndexController::index()
class IndexController extends AppController 
{
    var $paginate = array(
        'limit' => 100,
    );
    
    function index()
    {
        $q = (isset($this->params['url']['q'])) ? $this->params['url']['q'] : '';
        $conditions = array(
            'columns LIKE ?' =>  $q . '%',
        );
        
        $query_string = $this->params['url'];
        unset($query_string['url']);
        $this->set(array(
            'rows'         => $this->paginate('Model', $conditions),'
            'q'            => $q,
            'query_string' => http_build_query($query_string),
        ));
    }
}

Viewのページング部分
//ここポイント
<?php $paginator->options(array('url' => array('?' => $query_string)));?>
<div class="paging">
    <?php echo $this->Paginator->prev('<<', array(), null, array('class'=>'disabled'));?>
    <?php echo $this->Paginator->numbers(array('separator' => ''));?>
    <?php echo $this->Paginator->next('>>', array(), null, array('class' => 'disabled'));?>
</div> 

見てもらえればわかるとおもうんですけど、
? の所に詰め込んでる感がある・・・。
ベストプラクティスが知りたい今日この頃です。