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学习 计数器实例代码
Jun 15 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 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邮件发送的两种方式
2020/04/28 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
python爬虫之urllib3的使用示例
2018/07/09 Python
Python版名片管理系统
2018/11/30 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
酒吧副总经理岗位职责
2013/12/10 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
公司委托书格式范文
2014/04/04 职场文书
《开国大典》教学反思
2014/04/19 职场文书
先进教师事迹材料
2014/12/16 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
冰雪公主观后感
2015/06/16 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
Nginx如何配置根据路径转发详解
2022/07/23 Servers