tjtjtjのメモ

自分のためのメモです

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; ?>&nbsp;
		<?php echo CHtml::link($user->username, array('user2/view', 'id'=>$user->id)); ?>&nbsp;
		<?php echo $user->password; ?>&nbsp;
		<?php echo $user->email; ?>&nbsp;
		<?php echo CHtml::link('update', array('user2/update', 'id'=>$user->id)); ?>&nbsp;
		<?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; ?>&nbsp;
		<?php echo CHtml::link($user->username, array('user2/view', 'id'=>$user->id)); ?>&nbsp;
		<?php echo $user->password; ?>&nbsp;
		<?php echo $user->email; ?>&nbsp;
		<?php echo CHtml::link('update', array('user2/update', 'id'=>$user->id)); ?>&nbsp;
		<?php echo CHtml::link('delete', array('user2/delete', 'id'=>$user->id)); ?>
	</li>
<?php endforeach; ?>
</ol>
<?php $this->widget('CLinkPager', array(
    'pages' => $pages,
)) 
?>
確認

確かにページネーションされてます。DBアクセスも SELECT COUHNT(*) FROM table が追加されただけで気持ち悪いのはありませんでした。

f:id:tjtjtjofthedead:20110322235725j:image

limit, offsetの解決

ページサイズの初期値は CPagination::pageSize = 10 です。limit は CPagination::pageSize 、offset は get渡しされたページ番号($_GET('page')) * pageSize で算出され、CPagination::applyLimit で $criteria に設定されます。

モデル、クライテリア、ページネートが分離されているんですね。これはシンプルでいい感じです。