分页

最后更新于:2022-04-02 05:14:43

[TOC] # 分页 当我们需要逐渐呈现大量任意数据时,就会发生分页过程。`Phalcon\Paginator`提供了一种快速便捷的方法,可将这些数据集拆分为可浏览页面。 ## 数据适配器 该组件使用适配器封装不同的数据源: | 适配器 | 描述 | | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Phalcon\Paginator\Adapter\NativeArray` | 使用PHP数组作为源数据 | | `Phalcon\Paginator\Adapter\Model` | 使用`Phalcon\Mvc\Model\Resultset`对象作为源数据。由于PDO不支持可滚动游标,因此不应使用此适配器对大量记录进行分页 | | `Phalcon\Paginator\Adapter\QueryBuilder` | 使用`Phalcon\Mvc\Model\Query\Builder`对象作为源数据| ## 工厂 使用`adapter`选项加载Paginator Adapter类 ```php modelsManager->createBuilder() ->columns('id, name') ->from('Robots') ->orderBy('name'); $options = [ 'builder' => $builder, 'limit' => 20, 'page' => 1, 'adapter' => 'queryBuilder', ]; $paginator = Factory::load($options); ``` ## 示例 在下面的示例中,分页器将使用模型中的查询结果作为其源数据,并将显示的数据限制为每页10条记录: ```php request->getQuery('page', 'int'); // GET // $this->request->getPost('page', 'int'); // POST $currentPage = (int) $_GET['page']; // The data set to paginate $robots = Robots::find(); // Create a Model paginator, show 10 rows by page starting from $currentPage $paginator = new PaginatorModel( [ 'data' => $robots, 'limit' => 10, 'page' => $currentPage, ] ); // Get the paginated results $page = $paginator->getPaginate(); ``` `$currentPage` 变量控制要显示的页面。`$paginator->getPaginate()` 返回包含分页数据的`$page`对象。它可以用于生成分页: ```php items as $item) { ?>
Id Name Type
id; ?> name; ?> type; ?>
``` `$page` 对象还包含导航数据: ```php First Previous Next Last current, ' of ', $page->total_pages; ?> ``` ## 使用适配器 每个适配器必须使用的源数据示例: ```php Products::find(), 'limit' => 10, 'page' => $currentPage, ] ); // Passing an array as data $paginator = new PaginatorArray( [ 'data' => [ ['id' => 1, 'name' => 'Artichoke'], ['id' => 2, 'name' => 'Carrots'], ['id' => 3, 'name' => 'Beet'], ['id' => 4, 'name' => 'Lettuce'], ['id' => 5, 'name' => ''], ], 'limit' => 2, 'page' => $currentPage, ] ); // Passing a QueryBuilder as data $builder = $this->modelsManager->createBuilder() ->columns('id, name') ->from('Robots') ->orderBy('name'); $paginator = new PaginatorQueryBuilder( [ 'builder' => $builder, 'limit' => 20, 'page' => 1, ] ); ``` ## 页面属性 The `$page` 对象具有以下属性: | 属性 | 描述 | | ------------- | ------------------------------------------------------ | | `items` | 要在当前页面显示的记录集 | | `current` | 当前页面 | | `before` | 当前的上一页 | | `next` | 当前的下一页 | | `last` | 记录集中的最后一页 | | `total_pages` | 页数 | | `total_items` | 源数据中的项目数 | ## 实现自己的适配器 必须实现 `Phalcon\Paginator\AdapterInterface` 接口才能创建自己的分页器适配器或扩展现有的分页器适配器: ```php ';