2012年3月1日

Yii Framework: CLinkPagerの実装を拡張してシンプルにする

やりたいこと

  • header, footer プロパティを無視
  • prevPageLabel, nextPageLabel プロパティなどの値を固定
  • htmlOptions の class 名を yiiPager から pager に変更
  • ページャーの css ファイルを html の head に貼らずに main.css に付け足す

それの何がいいの

  • ページャーの見た目がシンプルになる
  • ラベルの固定や css ファイルを呼び出さないので、実装がシンプルになる
  • 無駄なファイルが assets ディレクトリに作られるのを防ぐ
  • コアのウィジェットクラスがどう実装されているか把握できる
  • コアのウィジェットクラスの拡張方法が学べる
  • ビューでのウィジェットの記述がシンプルになる

やり方

まず framework/web/widgets/pagers 下の pager.css ファイルの中身を main.css に移して yiiPager 部分をすべて pager に置き換えます。続いてprotected/components/widgets 下に LinkPager.php というクラスファイルを作ります。あとは CLinkPager クラスを継承して、自分好みになるようにメソッドをオーバーライドしていきます。
<?php
class LinkPager extends CLinkPager
{
/**
* @see CLinkPager::init()
*/
public function init()
{
$this->firstPageLabel = '&laquo;&laquo;';
$this->prevPageLabel = '&laquo;';
$this->nextPageLabel = '&raquo;';
$this->lastPageLabel = '&raquo;&raquo;';
$this->htmlOptions['id'] = $this->getId();
$this->htmlOptions['class'] = 'pager';
}
/**
* @see CLinkPager::run()
*/
public function run()
{
$buttons = $this->createPageButtons();
if (empty($buttons)) {
return;
}
echo CHtml::tag('ul', $this->htmlOptions, implode("\n", $buttons));
}
}
view raw LinkPager.php hosted with ❤ by GitHub

init() では、ラベルの値を固定にしたのと、htmlOptions の class 名を yiiPager から pager にしています。run() では header, footer プロパティを echo しないように省略して、$this->registerClientScript() も省いています。こうすることによって、assets ディレクトリにファイルが作られないのと、html の head にページャーの css ファイルを貼るのを防げます。

あとは protected/config/main.php の import 部分に application.components.widgets.*' を付け足して、ビューで <?php $this->widget('LinkPager', compact('pages')); ?>  と書けばOKです。ページネーションのロジック部分は CPagination を参考にしてみてください。

参考リンク

0 件のコメント:

コメントを投稿