Yii分页用法实例详解


Posted in PHP onDecember 04, 2014

下面我总结了在Yii常用的一些yii分页方式与实例代码,这里有普通分页与ajax实现分页,希望此文章对大家会有所帮助。

第一种:CListView分页  针对对象形式的数据分页

Controller:

public function actionAjax() { 

        $criteria = new CDbCriteria(); 

        //$criteria->order = 'news_id DESC'; 

        $criteria->condition = 'user_id = 1'; 

  

        $dataProvider = new CActiveDataProvider('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' => ' 

<DIV class="alert alert-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:

public function actionIndex() { 

  

        $criteria = new CDbCriteria(); 

        $criteria->order = 'news_id DESC'; 

        $criteria->condition = 'user_id = 1'; 

  

        $count = News::model()->count($criteria); 

        $pages = new CPagination($count); 

  

        $pages->pageSize = 10; 

        $pages->applyLimit($criteria); 

        $list = News::model()->findAll($criteria); 

  

        $this->render('index', array('list' => $list, 'pages' => $pages)); 

}

View:

<UL> 

    <?php foreach ($list as $item): ?> 

    <LI> 

          

        <DIV class=page-header> 

            <?php echo $item--->news_title; ?> 

        </DIV> 

  

        <DIV class=content> 

            <?php echo $item--->news_intro; ?> 

        </DIV> 

  

    </LI> 

<?php endforeach; ?> 

</UL> 

  

<DIV class=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层:

public function actionReport()

{

$sql = "select remitdate, sum(rate) sumrate from td_delivery 

group by remitdate 

order by remitdate desc";

$criteria=new CDbCriteria();

$result = Yii::app()->db->createCommand($sql)->query();

$pages=new CPagination($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层:
<?php foreach($posts as $row):?> 

 <?php echo CHtml::link($row["remitdate"],array('delivery/view','remitdate'=>$row["sumrate"]));?>

 <?php echo $row["sumrate"]."<br />" ?>

 <?php endforeach;?>

 <?php 

 //分页widget代码: 

 $this->widget('CLinkPager',array('pages'=>$pages));

?>

优点: DAO效率高; 缺点: view层需要自己写一些样式,稍显麻烦一点

第四种:widget实现分页

model层:

/**

* @var string attribute : 日运费 (统计用)

* 需要对新增加的字段做个声明

*/

public $dayrate;
/*

* 统计功能: 统计每日的运费

*/

public function statistics()

{

$criteria = new CDbCriteria;

$criteria->select = 'remitdate, sum(rate) AS dayrate';

$criteria->group = 'remitdate';

return new CActiveDataProvider(get_class($this), array(

'criteria'=>$criteria,

'sort'=>array(

// 表头设置点击排序的字段

'attributes'=>array(

'remitdate',

'dayrate'=>array(

'asc'=>'dayrate',

'desc'=>'dayrate DESC',

)

),

'defaultOrder'=>'remitdate desc',

),

)); 

}

Controller层:
/**

* 运单统计功能:

* 按日期统计

*/

public function actionReport()

{

$model=new Delivery('statistics');

$model->unsetAttributes(); // clear any default values

  

$this->render('report',array(

'model'=>$model,

));

}

View层:
<?php $this->widget('zii.widgets.grid.CGridView', array(

'id'=>'delivery-grid',

'dataProvider'=>$model->statistics(),

'filter'=>$model,

'columns'=>array(

'remitdate',

'dayrate',

array(

'class'=>'CButtonColumn',

),

),

));

?>

优点: 可以使用自带的样式; 缺点: 效率略低.

第五种:Ajax分页

YII中ajax分页有多种实现方法,比较传统的就是在view中写JS来实现,大概的就是这样:
在view中js大概逻辑是这样

$('#listview .yiiPager a').live('click',function(){

        $.ajax({

            url:$(this).attr('href'),

            success:function(html){

                $('#listview').html(html);

            }

        });

        return false;//阻止a标签

});

然后在controller中判断ajax请求,再使用renderPartial方法渲染局部List视图,然后局部视图会被view中的ajax方法填充到局部刷新的div中。controller的大概逻辑是:
if (Yii::app()->request->isAjaxRequest) {

$this->renderPartial('_comments',array(

    'model' => $model,

    'comments' => $comments,//在局部视图中foreach得到每条数据

    'pages' => $pages,

   ));

    Yii::app()->end();

}

后来发现YII中的CListview更方便,封装了分页,foreach显示list,还支持数据排序。具体的可以在YII的API手册中发掘。使用CListview是默认ajax分页的,使用方法如下:

controller中:

$criteria = new CDbCriteria();

$criteria->order = '`create_time` DESC';

$dataProvider = new CActiveDataProvider('Comments', array(

    'pagination'=>array(

      'pageSize'=>Yii::app()->params['commentsPerPage'],//设置分页条数以确定取出数据的条数

  ),

  'criteria'=>$criteria,

  ));

$this->render('comments',array(

         'model' => $model,

         'dataProvider' => $dataProvider,

));

然后在view中:
<?php $this->widget('zii.widgets.CListView', array(

  'dataProvider'=>$dataProvider,

  'itemView'=>'_comments',

  //'ajaxUpdate'=> false,//这样就不会AJAX翻页

  'pager' => array(//pager 的配置信息。默认为<CODE>array('class'=>'CLinkPager')</CODE>.也可以自己配置

   'nextPageLabel' => '下一页 »',

   'prevPageLabel' => '« 上一页'

  ),

//在这里还可以配置一些排序规则,具体可以查阅手册

));

?>

这样就实现了Ajax分页,很方便。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP新手上路(十四)
Oct 09 PHP
php URL编码解码函数代码
Mar 10 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
Yii配置文件用法详解
Dec 04 #PHP
yii实现图片上传及缩略图生成的方法
Dec 04 #PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 #PHP
yii的CURD操作实例详解
Dec 04 #PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 #PHP
php生成随机颜色方法汇总
Dec 03 #PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 #PHP
You might like
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
js常用排序实现代码
2010/12/28 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
Django model序列化为json的方法示例
2018/10/16 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
资料员的岗位职责
2013/11/20 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
Nginx缓存设置案例详解
2021/09/15 Servers
JavaScript获取URL参数的方法分享
2022/04/07 Javascript
sql注入报错之注入原理实例解析
2022/06/10 MySQL