分页Pagination
分页的过程发生在我们需要逐渐呈现大组的任意数据。Phalcon\Paginator提供快速和方便的方式将这些数据集输出到页面。
The process of pagination takes place when we need to present big groups of arbitrary data gradually. Phalcon\Paginator offers a fast and convenient way to split these sets of data browsable pages.
数据适配器Data Adapters
该组件使用了适配器封装不同来源的数据:
This component makes use of adapters to encapsulate different sources of data:
Adapter | Description |
---|---|
NativeArray | Use a PHP array as source data |
Model | Use a Phalcon\Mvc\Model\Resultset object as source data. Since PDO doesn’t support scrollable cursors this adapter shouldn’t be used to paginate a large number of records |
QueryBuilder | Use a Phalcon\Mvc\Model\Query\Builder object as source data |
示例Examples
在下面的示例中,paginator将使用从一个模型查询的结果作为源数据,并限制每页显示的数据到10记录:
In the example below, the paginator will use as its source data the result of a query from a model, and limit the displayed data to 10 records per page:
<?php
use Phalcon\Paginator\Adapter\Model as PaginatorModel;
// Current page to show
// In a controller this can be:
// $this->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(
array(
"data" => $robots,
"limit" => 10,
"page" => $currentPage
)
);
// Get the paginated results
$page = $paginator->getPaginate();
变量$currentPage控件将显示在页面。$paginator->getPaginate()返回一个包含分页数据$page对象。它可以用于产生分页:
Variable $currentPage controls the page to be displayed. The $paginator->getPaginate() returns a $page object that contains the paginated data. It can be used for generating the pagination:
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Type</th>
</tr>
<?php foreach ($page->items as $item) { ?>
<tr>
<td><?php echo $item->id; ?></td>
<td><?php echo $item->name; ?></td>
<td><?php echo $item->type; ?></td>
</tr>
<?php } ?>
</table>
$page对象包含导航链接数据:
The $page object also contains navigation data:
<a href="/robots/search">First</a>
<a href="/robots/search?page=<?= $page->before; ?>">Previous</a>
<a href="/robots/search?page=<?= $page->next; ?>">Next</a>
<a href="/robots/search?page=<?= $page->last; ?>">Last</a>
<?php echo "You are in page ", $page->current, " of ", $page->total_pages; ?>
适配器使用Adapters Usage
为每个适配器设置数据源的例子如下:
An example of the source data that must be used for each adapter:
<?php
use Phalcon\Paginator\Adapter\Model as PaginatorModel;
use Phalcon\Paginator\Adapter\NativeArray as PaginatorArray;
use Phalcon\Paginator\Adapter\QueryBuilder as PaginatorQueryBuilder;
//Passing a resultset as data
$paginator = new PaginatorModel(
array(
"data" => Products::find(),
"limit" => 10,
"page" => $currentPage
)
);
//Passing an array as data
$paginator = new PaginatorArray(
array(
"data" => array(
array('id' => 1, 'name' => 'Artichoke'),
array('id' => 2, 'name' => 'Carrots'),
array('id' => 3, 'name' => 'Beet'),
array('id' => 4, 'name' => 'Lettuce'),
array('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(array(
"builder" => $builder,
"limit" => 20,
"page" => 1
));
页面属性Page Attributes
$page对象包含如下属性:
The $page object has the following attributes:
Attribute | Description |
---|---|
items | The set of records to be displayed at the current page |
current | The current page |
before | The previous page to the current one |
next | The next page to the current one |
last | The last page in the set of records |
total_pages | The number of pages |
total_items | The number of items in the source data |
自定义适配器Implementing your own adapters
Phalcon\Paginator\AdapterInterface 必须被实现如果要创建自己的分页适配器:
The Phalcon\Paginator\AdapterInterface interface must be implemented in order to create your own paginator adapters or extend the existing ones:
<?php
use Phalcon\Paginator\AdapterInterface as PaginatorInterface;
class MyPaginator implements PaginatorInterface
{
/**
* Adapter constructor
*
* @param array $config
*/
public function __construct($config);
/**
* Set the current page number
*
* @param int $page
*/
public function setCurrentPage($page);
/**
* Returns a slice of the resultset to show in the pagination
*
* @return stdClass
*/
public function getPaginate();
}