找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 514|回复: 0
打印 上一主题 下一主题

Yii分页用法实例详解

[复制链接]

2536

主题

2536

帖子

7532

积分

论坛元老

Rank: 8Rank: 8

积分
7532
跳转到指定楼层
楼主
发表于 2018-2-14 05:51:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            下面我总结了在Yii常用的一些yii分页方式与实例代码,这里有普通分页与ajax实现分页,希望此文章对大家会有所帮助。
第一种:CListView分页  针对对象形式的数据分页
Controller:
[U]复制代码[/U] 代码如下: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:
[U]复制代码[/U] 代码如下: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' => '

    暂无数据!

', //无数据时显示内容
                    'pagerCssClass' => 'pagination', //分页的class
                    'pager' => array(
                        'selectedPageCssClass' => 'active', //当前页的class
                        'hiddenPageCssClass' => 'disabled', //禁用页的class
                        'header' => '', //分页前显示的内容
                        'maxButtonCount' => 10, //显示分页数量
                        'htmlOptions' => array('class' => ''),
                        'firstPageLabel' => '首页',
                        'nextPageLabel' => '下一页',
                        'prevPageLabel' => '上一页',
                        'lastPageLabel' => '末页',
                    ),
                ));
?>
第二种:CLinkPager  针对数组形式的数据分页
Controller:
[U]复制代码[/U] 代码如下: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:
[U]复制代码[/U] 代码如下:[U]
     
   

  •          
             
                news_title; ?>
             
      
             
                news_intro; ?>
             
      
         

    [/U]
      

        widget('CLinkPager', array(
            'pages' => $pages,
            'selectedPageCssClass' => 'active', //当前页的class
            'hiddenPageCssClass' => 'disabled', //禁用页的class
            'header' => '', //分页前显示的内容
            'maxButtonCount' => 10, //显示分页数量
            'htmlOptions' => array('class' => ''),
            'firstPageLabel' => '首页',
            'nextPageLabel' => '下一页',
            'prevPageLabel' => '上一页',
            'lastPageLabel' => '末页',
                )
        );
        ?>
    第三种: DAO实现分页.
    Controller层:
    [U]复制代码[/U] 代码如下: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 ffset,:limit");
    $result->bindValue('ffset', $pages->currentPage*$pages->pageSize);
    $result->bindValue(':limit', $pages->pageSize);
    $posts=$result->query();
    $this->render('report',array(
    'posts'=>$posts,
    'pages'=>$pages,
    ));
    }
    View层:
    [U]复制代码[/U] 代码如下:
    $row["sumrate"]));?>


    widget('CLinkPager',array('pages'=>$pages));
    ?>
    优点: DAO效率高; 缺点: view层需要自己写一些样式,稍显麻烦一点
    第四种:widget实现分页
    model层:
    [U]复制代码[/U] 代码如下:/**
    * @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层:
    [U]复制代码[/U] 代码如下:/**
    * 运单统计功能:
    * 按日期统计
    */
    public function actionReport()
    {
    $model=new Delivery('statistics');
    $model->unsetAttributes(); // clear any default values
      
    $this->render('report',array(
    'model'=>$model,
    ));
    }
    View层:
    [U]复制代码[/U] 代码如下: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大概逻辑是这样
    [U]复制代码[/U] 代码如下('#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的大概逻辑是:
    [U]复制代码[/U] 代码如下: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中:
    [U]复制代码[/U] 代码如下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中:
    [U]复制代码[/U] 代码如下:widget('zii.widgets.CListView', array(
      'dataProvider'=>$dataProvider,
      'itemView'=>'_comments',
      //'ajaxUpdate'=> false,//这样就不会AJAX翻页
      'pager' => array(//pager 的配置信息。默认为array('class'=>'CLinkPager').也可以自己配置
       'nextPageLabel' => '下一页 »',
       'prevPageLabel' => '« 上一页'
      ),
    //在这里还可以配置一些排序规则,具体可以查阅手册
    ));
    ?>
    这样就实现了Ajax分页,很方便。
    希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
                
                
    您可能感兴趣的文章:
  • YII实现分页的方法
  • Yii使用CLinkPager分页实例详解
  • Yii2分页的使用及其扩展方法详解
  • yii2分页之实现跳转到具体某页的实例代码
  • Yii框架结合sphinx,Ajax实现搜索分页功能示例
  • YII框架中搜索分页jQuery写法详解
  • yii框架搜索分页modle写法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端