Yii分页用法实例详解
下面我总结了在Yii常用的一些yii分页方式与实例代码,这里有普通分页与ajax实现分页,希望此文章对大家会有所帮助。
第一种:CListView分页 针对对象形式的数据分页
Controller:
publicfunctionactionAjax(){ $criteria=newCDbCriteria(); //$criteria->order='news_idDESC'; $criteria->condition='user_id=1'; $dataProvider=newCActiveDataProvider('News',array( 'pagination'=>array( 'pageSize'=>Yii::app()->params['pagesize'], 'pageVar'=>Yii::app()->params['pagevar'], ), 'criteria'=>$criteria, )); $this->render('view',array( 'dataProvider'=>$dataProvider, )); }
View:
<?php $this->widget('zii.widgets.CListView',array( 'dataProvider'=>$dataProvider,//数据 'itemView'=>'_view',//显示的模版 'id'=>Yii::app()->controller->id, 'itemsTagName'=>'ul', 'ajaxVar'=>'',//默认为page或ajax去掉后url更简洁 'htmlOptions'=>array('class'=>Yii::app()->controller->id), 'loadingCssClass'=>'loading',//默认为list-view-loading //'template'=>'{summary}{sorter}{items}{pager}',//显示的顺序 //'ajaxUpdate'=>false,//是否ajax分页 false或分页显示的容器id //'beforeAjaxUpdate'=>'before_ajax_update', //回调函数在common.js里完成 //'afterAjaxUpdate'=>'after_ajax_update', 'emptyText'=>' <DIVclass="alertalert-waning"> 暂无数据! </DIV> ',//无数据时显示内容 'pagerCssClass'=>'pagination',//分页的class 'pager'=>array( 'selectedPageCssClass'=>'active',//当前页的class 'hiddenPageCssClass'=>'disabled',//禁用页的class 'header'=>'',//分页前显示的内容 'maxButtonCount'=>10,//显示分页数量 'htmlOptions'=>array('class'=>''), 'firstPageLabel'=>'首页', 'nextPageLabel'=>'下一页', 'prevPageLabel'=>'上一页', 'lastPageLabel'=>'末页', ), )); ?>
第二种:CLinkPager 针对数组形式的数据分页
Controller:
publicfunctionactionIndex(){ $criteria=newCDbCriteria(); $criteria->order='news_idDESC'; $criteria->condition='user_id=1'; $count=News::model()->count($criteria); $pages=newCPagination($count); $pages->pageSize=10; $pages->applyLimit($criteria); $list=News::model()->findAll($criteria); $this->render('index',array('list'=>$list,'pages'=>$pages)); }
View:
<UL> <?phpforeach($listas$item):?> <LI> <DIVclass=page-header> <?phpecho$item--->news_title;?> </DIV> <DIVclass=content> <?phpecho$item--->news_intro;?> </DIV> </LI> <?phpendforeach;?> </UL> <DIVclass=pagination> <?php $this--->widget('CLinkPager',array( 'pages'=>$pages, 'selectedPageCssClass'=>'active',//当前页的class 'hiddenPageCssClass'=>'disabled',//禁用页的class 'header'=>'',//分页前显示的内容 'maxButtonCount'=>10,//显示分页数量 'htmlOptions'=>array('class'=>''), 'firstPageLabel'=>'首页', 'nextPageLabel'=>'下一页', 'prevPageLabel'=>'上一页', 'lastPageLabel'=>'末页', ) ); ?> </DIV>
第三种:DAO实现分页.
Controller层:
publicfunctionactionReport() { $sql="selectremitdate,sum(rate)sumratefromtd_delivery groupbyremitdate orderbyremitdatedesc"; $criteria=newCDbCriteria(); $result=Yii::app()->db->createCommand($sql)->query(); $pages=newCPagination($result->rowCount); $pages->pageSize=2; $pages->applyLimit($criteria); $result=Yii::app()->db->createCommand($sql."LIMIT:offset,:limit"); $result->bindValue(':offset',$pages->currentPage*$pages->pageSize); $result->bindValue(':limit',$pages->pageSize); $posts=$result->query(); $this->render('report',array( 'posts'=>$posts, 'pages'=>$pages, )); }
View层:
<?phpforeach($postsas$row):?> <?phpechoCHtml::link($row["remitdate"],array('delivery/view','remitdate'=>$row["sumrate"]));?> <?phpecho$row["sumrate"]."<br/>"?> <?phpendforeach;?> <?php //分页widget代码: $this->widget('CLinkPager',array('pages'=>$pages)); ?>
优点:DAO效率高;缺点:view层需要自己写一些样式,稍显麻烦一点
第四种:widget实现分页
model层:
/** *@varstringattribute:日运费(统计用) *需要对新增加的字段做个声明 */ public$dayrate;
/* *统计功能:统计每日的运费 */ publicfunctionstatistics() { $criteria=newCDbCriteria; $criteria->select='remitdate,sum(rate)ASdayrate'; $criteria->group='remitdate'; returnnewCActiveDataProvider(get_class($this),array( 'criteria'=>$criteria, 'sort'=>array( //表头设置点击排序的字段 'attributes'=>array( 'remitdate', 'dayrate'=>array( 'asc'=>'dayrate', 'desc'=>'dayrateDESC', ) ), 'defaultOrder'=>'remitdatedesc', ), )); }