View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

页码和数据排序

在最新的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
<?php
namespace app\controllers;
use app\models\Film;
use yii\web\Controller;
use yii\data\Pagination;
use yii\data\Sort;
class FilmController extends Controller
{
    public function actionIndex()
    {
        $query = Film::find();
        $countQuery = clone $query;
        $pages = new Pagination(['totalCount' => $countQuery->count()]);
        $pages->pageSize = 5;
        $sort = new Sort([
            'attributes' => [
                'title',
                'rental_rate'
            ]
        ]);
        $models = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->orderBy($sort->orders)
            ->all();
        return $this->render('index', [
            'models' => $models,
            'sort' => $sort,
            'pages' => $pages
        ]);
    }
}
  1. 现在,让我们实现@app/views/film/index.php
<?php
use yii\widgets\LinkPager;
/**
 * @var \app\models\Film $models
 * @var \yii\web\View $this
 * @var \yii\data\Pagination $pages
 * @var \yii\data\Sort $sort
 */
?>
    <h1>Films List</h1>
    <p><?=$sort->link('title')?> |
        <?=$sort->link('rental_rate')?></p>
<?php foreach ($models as $model): ?>
    <div class="list-group">
        <h4 class="list-group-item-heading"> <?=$model->title ?>
            <label class="label label-default">
                <?=$model->rental_rate ?>
            </label>
        </h4>
        <p class="list-group-item-text"><?=$model->description
            ?></p>
    </div>
<?php endforeach ?>
<?=LinkPager::widget([
    'pagination' => $pages
]); ?>
  1. 尝试访问http://yii-book.app/index.php?r=film/index。你应该能得到一个工作的分页,和允许通过电影标题和租用率排序的链接:

工作原理…

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

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

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

参考

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