2010年9月1日水曜日

CakePHP paginateのカスタマイズ

URLをカスタマイズ

とりあえず、"Paginator"が生成するURLを文字列置換する方式。これを共通部品にするため、app/views/elements/ の中に"element"を作成する。

app/views/elements/pagination.ctp

<?php
$prev_link = str_replace('page:', '',
                         $paginator->prev('前のページ', null, null, array('class' => 'disabled')) );
$prev_link = preg_replace('/\/1"/', '"', $prev_link);

$numbers_link = str_replace('page:', '', $paginator->numbers());
$numbers_link = preg_replace('/\/1"/', '"', $numbers_link);

$next_link = str_replace('page:', '',
                         $paginator->next('次のページ', null, null, array('class' => 'disabled')));

echo $prev_link;
echo $numbers_link;
echo $next_link;
?>

このelementを呼び出すためのコード(Viewに記述)。

  <?php echo $this->element('pagination'); ?>

Routesの変更

paginateのURLに対応するため、Routing情報を追加。

app/config/routes.php

/* pagination */
  Router::connect('/:controller/:action/:page',
                  array('action' => 'index', 'page' => null),
                  array('action' => 'index', 'page' => '[0-9]+'));

ここでconnect()の引数は、

  • URLは controller名/action名/page名 の形式になっている
  • controller名に対応するControllerが呼び出される(デフォルトのRouting)
  • action名に対応するActionではなく、強制的にindexを呼び出す(デフォルトのRoutingを変更)
  • page名はnull可(オプショナルな「カスタムRoute要素」)
  • action名は"index"という文字列にマッチしないといけない
  • page名は半角数字列にマッチしないといけない

というような意味。

0 件のコメント:

コメントを投稿