本文链接:https://www.cnblogs.com/alanabc/p/9407193.html
当一次要在一个页面上显示很多数据时, 通常需要将其分成几部分, 每个部分都包含一些数据列表并且一次只显示一部分。 这些部分在网页上被称为 分页。
见 Yii Framework 官方网站网址:https://www.yiiframework.com/doc/guide/2.0/zh-cn/output-pagination
官方案例和网上大多数的例程都是在控制器(Controller)中使用分页(Pagination),这里提供一个在模型(Model)中使用的例程。至于选用哪个,看实际情况决定,我这里是为了方便分割代码逻辑。
准备工作(数据库)
我已经部署好了 Yii2,现在数据库中有一个数据表叫做 order,存放有订单(数据字段略)。
模型 Model
根据 Yii 的命名规则,在 models 文件夹中新建 Order.php
文件,内容和注释如下:
<?php
namespace app\models;
// 记得导入class
use yii\data\Pagination;
use yii\widgets\ActiveForm;
class Order extends ActiveForm
{
// 私有,防止被外部代码篡改
private $pagination;
/**
* 获取$pagination,提供给外部代码调用
* @return mixed
*/
public function getPagination()
{
return $this->pagination;
}
/**
* 从Order数据表中查询所有条目,并以id字段为基准,进行降序排列输出
* @return mixed
*/
public function getAll()
{
// 预查询,此时还没有执行。where()条件查询、orderBy()排序等都应该放在这里
$query = Order::find()->orderBy(['id' => SORT_DESC]);
// 获取能够查询到的数据条目数量(这就是条件查询等语句要放在上一行代码的原因),但是还没有执行查询
$count = $query->count();
// 构造分页对象
$this->pagination = new Pagination(['totalCount' => $count]);
// 使用分页对象填充limit语句,并获得数据(此时才真正执行数据库查询)
return $query->offset($this->pagination->offset)
->limit($this->pagination->limit)
->asArray()
->all();
}
}
控制器 Controller
控制器主要控制数据输入输出,需要把上面模型中的数据当作参数传递给视图(View)。在 controllers 文件夹中创建你的控制器类,我这里直接使用 Yii2 Basic版原有的 SiteController.php
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\Order;
class SiteController extends Controller
{
public function actionOrder(){
$model = new Order();
$data = $model->getAll();
// 在这里把模型中的分页对象$pagination作为参数pagination传递给视图
return $this->render('orderList', [
'data' => $data,
'pagination' => $model->getPagination()
]);
}
}
视图 View
根据 Yii2 的命名规则,在view/site 文件夹内新建视图文件 orderList.php
,其内容如下,主要是获得控制器传过来的参数并渲染
<?php
// 再次提醒,不要忘记引用class
use \yii\widgets\LinkPager;
?>
<!--content start, write content bellow.-->
<!--table start-->
<table>
<thead>
<tr>
<th>订单流水号</th>
<th>收款方</th>
<th>付款方</th>
<th>付款金额</th>
<th>付款时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php if (!empty($data)) {
// 输出数据
foreach ($data as $v) {
?>
<tr>
<td><?= $v['order_number'] ?></td>
<td><?= $v['payee'] ?></td>
<td><?= $v['payer'] ?></td>
<td><?= $v['payment_amount'] ?></td>
<td><?= $v['time_of_payment'] ?></td>
<td>
<button>查看</button>
</td>
</tr>
<?php }
} else { ?>
<tr>
<td colspan="6">暂时没有数据</td>
</tr>
<?php } ?>
</tbody>
</table>
<!--table end-->
<?php
try {
// 输出分页按钮
echo LinkPager::widget(['pagination' => $pagination]);
} catch (Exception $e) {
// do nothing
}
?>
<!--content end-->
上面代码中的 echo LinkPager::widget(['pagination' => $pagination]);
就把分页按钮给输出了,默认每页20条数据,点击页码就可以输出当页的数据,js 代码什么的都不需要自己动手写。至于样式,当然是自己写 css 咯。