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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
一个PHP+MSSQL分页的例子
Oct 09 PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
PHP调用接口API封装的例子
Oct 11 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
TP5框架安全机制实例分析
Apr 05 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
用javascript实现画板的代码
2007/09/05 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
python一键去抖音视频水印工具
2018/09/14 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Python实现最大子序和的方法示例
2019/07/05 Python
详解Python是如何实现issubclass的
2019/07/24 Python
python Gabor滤波器讲解
2020/10/26 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
学习全国两会精神心得体会范文
2014/03/17 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js