yiiを使ってみる - ページネーション
前回、Yii Debug Toolbarを使ったのはページネーション化したとき想定外のDBアクセスがないか確認したかったからです。今回は本来の目的であるページネーション化をしてみます。
カテゴリをYiiFrameworkからYiiへ変更しました
参考
yii forums - yii初心者のための基本的なことまとめ
Yii - Class Reference - CPagination
ページネーション前
indexアクション
<?php class User2Controller extends Controller { public function actionIndex() { $users = User::model()->findAll(); $this->render('index', array('users'=>$users)); } }
indexビュー
<h1>user2/index</h1> <p> <?php echo CHtml::link('create', array('user2/create')); ?> </p> <ol> <?php foreach($users as $user) : ?> <li> <?php echo $user->id; ?> <?php echo CHtml::link($user->username, array('user2/view', 'id'=>$user->id)); ?> <?php echo $user->password; ?> <?php echo $user->email; ?> <?php echo CHtml::link('update', array('user2/update', 'id'=>$user->id)); ?> <?php echo CHtml::link('delete', array('user2/delete', 'id'=>$user->id)); ?> </li> <?php endforeach; ?> </ol>
ページネーション化
サンプルどおりにindexアクションをページネーション化してみる。
indexアクション
<?php class User2Controller extends Controller { public function actionIndex() { $criteria = new CDbCriteria(); $count = User::model()->count($criteria); $pages = new CPagination($count); $pages->applyLimit($criteria); $users = User::model()->findAll($criteria); $this->render('index', array( 'users' => $users, 'pages' => $pages )); } }
indexビュー
<h1>user2/index</h1> <p> <?php echo CHtml::link('create', array('user2/create')); ?> </p> <ol> <?php foreach($users as $user): ?> <li> <?php echo $user->id; ?> <?php echo CHtml::link($user->username, array('user2/view', 'id'=>$user->id)); ?> <?php echo $user->password; ?> <?php echo $user->email; ?> <?php echo CHtml::link('update', array('user2/update', 'id'=>$user->id)); ?> <?php echo CHtml::link('delete', array('user2/delete', 'id'=>$user->id)); ?> </li> <?php endforeach; ?> </ol> <?php $this->widget('CLinkPager', array( 'pages' => $pages, )) ?>
limit, offsetの解決
ページサイズの初期値は CPagination::pageSize = 10 です。limit は CPagination::pageSize 、offset は get渡しされたページ番号($_GET('page')) * pageSize で算出され、CPagination::applyLimit で $criteria に設定されます。
モデル、クライテリア、ページネートが分離されているんですね。これはシンプルでいい感じです。