zoukankan      html  css  js  c++  java
  • Yii2.0实用功能技巧解密之——分页功能

    Yii中的分页功能主要由yiiweb: Linkable接口、yiiwidgets: LinkPager类和yiidata: Pagination类三个组成。

    • yiidata: Pagination 主要功能是对分页中的参数进行设置,如当前页、每页大小、总页数,总记录数等。
    • yiiwidgets: LinkPager 主要是根据yiidata: Pagination类所提供的参数生成前台页面的分页html代码。



    使用:

    先在action里面生成分页对象,然后在前台的LinkPager中使用。
    后台controller中:

    function actionIndex()
    {
            $query = Article::find()->where(['status' => 1]);
            $countQuery = clone $query;
            $pages = new Pagination(['totalCount' => $countQuery->count()]);
            $models = $query->offset($pages->offset)
              ->limit($pages->limit)
              ->all();
    
            return $this->render('index', [
               'models' => $models,
               'pages' => $pages,
            ]);
    }

    前台view中:

    foreach ($models as $model) {
            // display $model here
    }
    
    // display pagination
    echo LinkPager::widget([
            'pagination' => $pages,
    ]);

    增强版

    那如果要设置每页的大小或者再加排序怎么办?这个我已经对这个功能进行了封装
    在基类控制器中添加:

    public function getPagedRows($query,$config=[])
    {
            $countQuery = clone $query;
            $pages=new Pagination(['totalCount' => $countQuery->count()]);
            if(isset($config['pageSize']))
            {
                    $pages->setPageSize($config['pageSize'],true);
            }
    
            $rows = $query->offset($pages->offset)->limit($pages->limit);
            if(isset($config['order']))
            {
                    $rows = $rows->orderBy($config['order']);
            }
            $rows = $rows->all();
    
    
            $rowsLable='rows';
            $pagesLable='pages';
    
            if(isset($config['rows']))
            {
                    $rowsLable=$config['rows'];
            }
            if(isset($config['pages']))
            {
                    $pagesLable=$config['pages'];
            }
    
            $ret=[];
            $ret[$rowsLable]=$rows;
            $ret[$pagesLable]=$pages;
    
            return $ret;
    }

    其中$config参数有:

    • pageSize:设置每页的大小
    • order:数据的排序
    • rows:返回的数组中数据对象的键名
    • pages:返回的数组中分页对象的键名



    后台使用如下:

    function actionIndex()
    {
            $query = Article::find()->where(['status' => 1]);
            //因为前台的数据对象为models,所以设置rows名称为models
            $locals = $this->getPagedRows($query, ['order'=>'time desc', ‘pageSize’=>5, 'rows'=>'models']);
            return $this->render('index', $locals);
    }

    是不是简单多了,而且由于这个功能实现在基类里面,所有的控制器都可以直接拿来用。

    示例代码可查看:
    https://github.com/yiifans/yiifo ... /BaseController.php 
    https://github.com/yiifans/yiifo ... hreadController.php 
    https://github.com/yiifans/yiifo ... lt/thread/index.php

    Yii爱好者中文社区门户

  • 相关阅读:
    游戏编程模式--原型模式
    游戏编程模式--观察者模式
    游戏编程模式--享元模式
    游戏编程模式--命令模式
    mybatis的线程安全
    开发遇到的问题
    spring的ThreadLocal解决线程安全
    i++
    jvm内存初步了解
    注解@RequestMapping,@RequestBody
  • 原文地址:https://www.cnblogs.com/yiifans/p/3761563.html
Copyright © 2011-2022 走看看