页码和数据排序

在最新的Yii发布版本中,焦点从直接使用Active Record移到了grids、lists和data providers。但是,有时直接使用Active Record是更好的。下面我们来看如果列出分好页的AR记录,并有能力对他们进行排序。在这部分中,我们将会创建电影的一个列表,并通过数据库中的一些属性对他们进行排序。在我们的例子中,我们将会通过电影标题和租用率对他们进行排序。

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. http://dev.mysql.com/doc/index-other.html下载Sakila数据库。
  3. 执行下载的SQL:首先是schema,然后是数据。
  4. config/main.php中配置DB连接,来使用Sakila数据库。
  5. 使用Gii生成Film模型

如何做…

  1. 首先,你需要创建@app/controllers/FilmController.php
  1. <?php
  2. namespace app\controllers;
  3. use app\models\Film;
  4. use yii\web\Controller;
  5. use yii\data\Pagination;
  6. use yii\data\Sort;
  7. class FilmController extends Controller
  8. {
  9. public function actionIndex()
  10. {
  11. $query = Film::find();
  12. $countQuery = clone $query;
  13. $pages = new Pagination(['totalCount' => $countQuery->count()]);
  14. $pages->pageSize = 5;
  15. $sort = new Sort([
  16. 'attributes' => [
  17. 'title',
  18. 'rental_rate'
  19. ]
  20. ]);
  21. $models = $query->offset($pages->offset)
  22. ->limit($pages->limit)
  23. ->orderBy($sort->orders)
  24. ->all();
  25. return $this->render('index', [
  26. 'models' => $models,
  27. 'sort' => $sort,
  28. 'pages' => $pages
  29. ]);
  30. }
  31. }
  1. 现在,让我们实现@app/views/film/index.php
  1. <?php
  2. use yii\widgets\LinkPager;
  3. /**
  4. * @var \app\models\Film $models
  5. * @var \yii\web\View $this
  6. * @var \yii\data\Pagination $pages
  7. * @var \yii\data\Sort $sort
  8. */
  9. ?>
  10. <h1>Films List</h1>
  11. <p><?=$sort->link('title')?> |
  12. <?=$sort->link('rental_rate')?></p>
  13. <?php foreach ($models as $model): ?>
  14. <div class="list-group">
  15. <h4 class="list-group-item-heading"> <?=$model->title ?>
  16. <label class="label label-default">
  17. <?=$model->rental_rate ?>
  18. </label>
  19. </h4>
  20. <p class="list-group-item-text"><?=$model->description
  21. ?></p>
  22. </div>
  23. <?php endforeach ?>
  24. <?=LinkPager::widget([
  25. 'pagination' => $pages
  26. ]); ?>
  1. 尝试访问http://yii-book.app/index.php?r=film/index。你应该能得到一个工作的分页,和允许通过电影标题和租用率排序的链接:

页码和数据排序 - 图1

工作原理…

首先,我们得到了全部模型的数量,通过将这个数传递给Pagination实例的totalCount变量,初始化了新的分页组件实例。然后我们使用$page->pageSize字段为我们的分页设置每页的大小。然后,我们为这个模型创建了一个sorter实例,指定了我们希望用作排序的模型属性,并通过调用orderBy应用排序条件到查询,然后将其传递给$sort->orders做为一个参数。然后,我们调用了all()从DB中获取记录。

现在,我们有了模型的列表、页面以及被用于link pager的数据,以及我们用于生成排序连接的sorter。

在这个视图中,我们使用我们搜集的数据。首先,我们使用Sort::link生成链接。然后,我们列出模型。最后,使用LinkPager小组件,我们渲染了分页控制。

参考

访问如下地址,获取更多关于分页和排序的信息: