一种方法是使用CPagination处理翻页需要的数据如:总数据项数,每页数据项数,当前页,然后在视图中使用CBasePager来绘制。
控制器动作的代码示范:
function actionIndex(){ $criteria = new CDbCriteria(); $count=Article::model()->count($criteria); $pages=new CPagination($count); // results per page $pages->pageSize=10; $pages->applyLimit($criteria); $models = Post::model()->findAll($criteria); $this->render('index', array( 'models' => $models, 'pages' => $pages )); }
视图代码:
<?php foreach($models as $model): ?> // display a model <?php endforeach; ?> // display pagination <?php $this->widget('CLinkPager', array( 'pages' => $pages, )) ?>
上面的方法很灵活,可以绘制任何的数据翻页界面。
如果你希望数据以表格的形式组织和展现,那么可以直接使用另外一个解决方案:派生Yii提供的CGridView类。
这里有一个广泛使用的模式,即通过在模型中实现数据搜索的函数,然后在视图中调用。
在数据搜索函数中定义数据过滤条件,翻页条件,并最终返回数据提供容器对象CActiveDataProvider。
控制器示范代码如下:
public function search($pagesize) { $criteria=new CDbCriteria; $criteria->compare('Id',$this->Id); $criteria->compare('Title',$this->Title,true); $criteria->compare('Views',$this->Views,true); $criteria->compare('Description',$this->Description,true); return new CActiveDataProvider(get_class($this), array( 'criteria'=>$criteria, 'pagination'=>array('pageSize'=>$pagesize?$pagesize:10), )); }
其中pagesize参数用来控制数据表每页显示最大数据数目。
视图代码:
<?php $this->widget('application.extensions.YourGridView', array( 'id'=>'article-grid', 'dataProvider'=>$model->search(6), 'filter'=>$model, 'columns'=>array( array( 'name'=>'Title', 'type'=>'raw', 'value'=>'$data->Title', 'htmlOptions'=>array('class'=>'alignLeft'), ), array( 'name'=>'Views', 'value'=>'$data->Views', 'htmlOptions'=>array('width'=>'40px') ) ) )); ?>