请选择 进入手机版 | 继续访问电脑版

Yii2|Yii爱好者中文社区门户

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: yii 控制器 数组
查看: 11047|回复: 19

Yii2.0实用功能技巧解密之——分页功能

  [复制链接]

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45470
发表于 2014-5-22 13:28:45 | 显示全部楼层 |阅读模式
Yii中的分页功能主要由yii\web: Linkable接口、yii\widgets: LinkPager类和yii\data: Pagination类三个组成。
  • yii\data: Pagination 主要功能是对分页中的参数进行设置,如当前页、每页大小、总页数,总记录数等。
  • yii\widgets: LinkPager 主要是根据yii\data: Pagination类所提供的参数生成前台页面的分页html代码。


使用:

先在action里面生成分页对象,然后在前台的LinkPager中使用。
后台controller中:
  1. function actionIndex()
  2. {
  3.         $query = Article::find()->where(['status' => 1]);
  4.         $countQuery = clone $query;
  5.         $pages = new Pagination(['totalCount' => $countQuery->count()]);
  6.         $models = $query->offset($pages->offset)
  7.           ->limit($pages->limit)
  8.           ->all();

  9.         return $this->render('index', [
  10.            'models' => $models,
  11.            'pages' => $pages,
  12.         ]);
  13. }
复制代码

前台view中:
  1. foreach ($models as $model) {
  2.         // display $model here
  3. }

  4. // display pagination
  5. echo LinkPager::widget([
  6.         'pagination' => $pages,
  7. ]);
复制代码


增强版

那如果要设置每页的大小或者再加排序怎么办?这个我已经对这个功能进行了封装
在基类控制器中添加:
  1. public function getPagedRows($query,$config=[])
  2. {
  3.         $countQuery = clone $query;
  4.         $pages=new Pagination(['totalCount' => $countQuery->count()]);
  5.         if(isset($config['pageSize']))
  6.         {
  7.                 $pages->setPageSize($config['pageSize'],true);
  8.         }

  9.         $rows = $query->offset($pages->offset)->limit($pages->limit);
  10.         if(isset($config['order']))
  11.         {
  12.                 $rows = $rows->orderBy($config['order']);
  13.         }
  14.         $rows = $rows->all();


  15.         $rowsLable='rows';
  16.         $pagesLable='pages';

  17.         if(isset($config['rows']))
  18.         {
  19.                 $rowsLable=$config['rows'];
  20.         }
  21.         if(isset($config['pages']))
  22.         {
  23.                 $pagesLable=$config['pages'];
  24.         }

  25.         $ret=[];
  26.         $ret[$rowsLable]=$rows;
  27.         $ret[$pagesLable]=$pages;

  28.         return $ret;
  29. }
复制代码


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


后台使用如下:
  1. function actionIndex()
  2. {
  3.         $query = Article::find()->where(['status' => 1]);
  4.         //因为前台的数据对象为models,所以设置rows名称为models
  5.         $locals = $this->getPagedRows($query, ['order'=>'time desc', ‘pageSize’=>5, 'rows'=>'models']);
  6.         return $this->render('index', $locals);
  7. }
复制代码

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

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


Yii2.0实用功能技巧解密之——目录



回复

使用道具 举报

1

主题

2

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2014-6-17 16:23:51 | 显示全部楼层
好东西 收获
回复 支持 反对

使用道具 举报

0

主题

3

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2014-7-1 21:14:44 | 显示全部楼层

这个当前页offset再哪儿设置
回复 支持 反对

使用道具 举报

0

主题

3

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2014-7-1 21:15:53 | 显示全部楼层
这个当前页offset再哪儿设置?
回复 支持 反对

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45470
 楼主| 发表于 2014-7-2 10:23:56 | 显示全部楼层
wskuner 发表于 2014-7-1 21:15
这个当前页offset再哪儿设置?

offset 是通过 url中的参数来获取的,参数名称为page,是在Pagination中定义的
  1. public $pageParam = 'page';
复制代码

你可以自己修改

另外还可能通过
  1. public function setPage($value, $validatePage = false)
复制代码
来设置当前页 也就是offset
  1. public function getPagedRows($query,$config=[])
  2. {
  3.         $countQuery = clone $query;
  4.         $pages=new Pagination(['totalCount' => $countQuery->count()]);
  5.         f(isset($config['page']))
  6.         {
  7.                 $pages->setPage($config['page'],true);
  8.         }

  9.         if(isset($config['pageSize']))
  10.         {
  11.                 $pages->setPageSize($config['pageSize'],true);
  12.         }

  13.         $rows = $query->offset($pages->offset)->limit($pages->limit);
  14.         if(isset($config['order']))
  15.         {
  16.                 $rows = $rows->orderBy($config['order']);
  17.         }
  18.         $rows = $rows->all();


  19.         $rowsLable='rows';
  20.         $pagesLable='pages';

  21.         if(isset($config['rows']))
  22.         {
  23.                 $rowsLable=$config['rows'];
  24.         }
  25.         if(isset($config['pages']))
  26.         {
  27.                 $pagesLable=$config['pages'];
  28.         }

  29.         $ret=[];
  30.         $ret[$rowsLable]=$rows;
  31.         $ret[$pagesLable]=$pages;

  32.         return $ret;
  33. }
复制代码


其中$config参数有:
  • page:当前页
  • pageSize:设置每页的大小
  • order:数据的排序
  • rows:返回的数组中数据对象的键名
  • pages:返回的数组中分页对象的键名
回复 支持 反对

使用道具 举报

1

主题

11

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2014-11-26 13:20:27 | 显示全部楼层
谢谢分享
回复

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45470
 楼主| 发表于 2014-11-26 13:25:10 | 显示全部楼层
不客气
回复

使用道具 举报

0

主题

15

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2015-1-26 09:35:39 | 显示全部楼层
你好,admin! 我是Yii新手,请问上面这些control、view、前台、后台在那个目录文件里面写?不知道如何下手?谢谢!
回复 支持 反对

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45470
 楼主| 发表于 2015-1-26 09:53:35 | 显示全部楼层
你先把basic模板跑一下看看
回复 支持 反对

使用道具 举报

25

主题

58

帖子

324

积分

中级会员

Rank: 3Rank: 3

积分
324
发表于 2015-4-20 17:13:50 | 显示全部楼层
如何统计数据条数呢
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Yii2|Yii爱好者中文社区门户  

GMT+8, 2017-3-26 11:22 , Processed in 0.291469 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表