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在Web开发领域的优势
Oct 09 PHP
谈谈新手如何学习PHP
Dec 23 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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模板引擎SMARTY
2006/10/09 PHP
在PHP中使用灵巧的体系结构
2006/10/09 PHP
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
解析Python中的二进制位运算符
2015/05/13 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
解析python实现Lasso回归
2019/09/11 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
Python实现画图软件功能方法详解
2020/07/28 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
Django实现简单的分页功能
2021/02/22 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
工程师求职简历的自我评价分享
2013/10/10 职场文书
八年级语文教学反思
2014/02/11 职场文书
工程技术员岗位职责
2014/03/02 职场文书
小学生综合素质评语
2014/04/23 职场文书
儿童生日会策划方案
2014/05/15 职场文书
推广普通话演讲稿
2014/05/23 职场文书
工作说明书格式
2014/07/29 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
委托书格式范文
2015/01/28 职场文书
使用Python拟合函数曲线
2022/04/14 Python