bajzany / paginator
该包最新版本(v1.0.2)没有可用的许可证信息。
Nette Framework分页器
v1.0.2
2019-06-24 15:29 UTC
Requires
- php: ^7.2
- chomenko/route-listener: ^1.0
- doctrine/orm: ^2.6
- latte/latte: ^2.4
- nette/application: ^2.4
- nette/bootstrap: ^2.4
- nette/di: ^2.4
- nette/utils: ^2.4
This package is auto-updated.
Last update: 2024-09-25 07:59:43 UTC
README
分页器
Nette分页器,用于使用doctrine查询
要求
安装
-
Composer安装
composer require bajzany/paginator dev-master
-
注册到Nette应用程序
extensions: BajzanyPaginator: Bajzany\Paginator\DI\PaginationExtension
如何在其他组件中使用
例如,我在bajzany/table中展示了此组件
在构造函数中注册paginatorControl
/**
* @var IPaginationControl
*/
private $paginationControl;
public function __construct(ITable $table, IPaginationControl $paginationControl, $name = NULL)
{
parent::__construct($name);
$this->table = $table;
$this->paginationControl = $paginationControl;
}
现在在同一个文件中创建函数renderPaginator、createComponentPaginator和getPaginationControl
public function renderPaginator()
{
$paginatorComponent = $this->getComponent(self::PAGINATOR_NAME);
$paginatorComponent->render();
}
/**
* @return \Bajzany\Paginator\PaginationControl
* @throws TableException
*/
public function createComponentPaginator()
{
$paginator = $this->table->getPaginator();
if (empty($paginator)) {
throw TableException::paginatorIsNotSet(get_class($this->table));
}
return $this->getPaginationControl()->create($paginator);
}
/**
* @return IPaginationControl
*/
public function getPaginationControl(): IPaginationControl
{
return $this->paginationControl;
}
下一个重点是EntityTable.php
构造函数中创建新的QueryPaginator()实例并保存到paginator属性中
/**
* @param string $entityClass
* @param EntityManager $entityManager
*/
public function __construct(string $entityClass, EntityManager $entityManager)
{
parent::__construct();
$this->entityClass = $entityClass;
$this->entityManager = $entityManager;
$this->entityRepository = $this->getEntityManager()->getRepository($this->getEntityClass());
$this->queryBuilder = $this->entityRepository->createQueryBuilder('e');
$this->paginator = new QueryPaginator();
}
重要的是EntityTable.php中的build函数
这里有一个具有getQuery()函数的queryBuilder,这是function $paginator->setQuery($query)所必需的。分页器返回更新后的查询并创建分页项(1,2,3,...)
/**
* @param IContainer $container
* @return ITable
*/
public function build(IContainer $container): ITable
{
if ($this->isBuild()) {
return $this;
}
$this->queryBuilder->whereCriteria($this->getWhere());
foreach ($this->getSort() as $by => $sort) {
$this->queryBuilder->addOrderBy($by, $sort);
}
$query = $this->queryBuilder->getQuery();
$paginator = $this->getPaginator();
if ($paginator instanceof QueryPaginator) {
$paginator->setQuery($query);
$query = $paginator->getQuery();
// IT'S BECAUSE ATTACH FUNCTION IN TABLECONTROL
$container->getComponent(TableControl::PAGINATOR_NAME);
}
$this->entities = $query->getResult();
return parent::build($container);
}
在latte中渲染分页时,请使用控制名YourComponent:paginator
<div class="box-footer clearfix">
{control tableEntity:paginator}
</div>
在Presenter中,我有createComponentTableEntity函数,你可以更改分页器pageSize,添加其他项到分页列表...
public function createComponentTableEntity()
{
$table = $this->tableFactory->createEntityTable(User::class);
$paginator = $table->getPaginator();
$item = $paginator->getPaginatorWrapped()->createItem();
$item->getContent()->addHtml(Html::el('')->setText('-1 Léňa'));
$table->getPaginator()->setPageSize(2);
...
...
...
return $this->tableFactory->createComponentTable($table);
}
PaginatiorWrapped是nette Html对象,非常容易编辑或添加其他子对象