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 相关文章推荐
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
js下函数般调用正则的方法附代码
Jun 22 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
php安装swoole扩展的方法
Mar 19 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 PHP
PHP解决高并发的优化方案实例
Dec 10 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 curl基本操作详解
2013/07/23 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python爬虫中多线程的使用详解
2019/09/23 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
介绍一下游标
2012/01/10 面试题
客服文员岗位职责
2013/11/29 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书