使用分页器
Using paginator
我是第一次使用分页器,现在我对如何以及在何处做事有一些疑问。
这是我的想法,下面是一些代码。
我了解在我的控制器操作中反对分页器,将对象提供给我的数据收集并将其提供给我的 ViewModel 对象。
因为我收到有关 ArrayAdapter 的错误,所以我将 post 错误和我的控制器中的使用语句 class。
错误:
Class 'Stammdaten\Controller\ArrayAdapter' not found
xyzController.php
use Zend\Paginator\Adapter\AdapterInterface;
use Zend\Paginator\Paginator;
use Zend\Paginator\ScrollingStyle\Sliding;
public function indexAction()
{
$page = $this->params()->fromRoute('page');
$paginator= new Paginator(new ArrayAdapter($this->mandantTable->Ansprechpartnerjoin()->toArray()));
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(20);
$paginator->setPageRange(5);
return new ViewModel([
'paginator' => $paginator,
]);
}
这里的第一个问题:这个适配器是正确的吗,因为我给了一个tableadapter集合,还是我必须换成另一个适配器?
我修改了使用分页器的路由,如下所示:
module.config.php
'router' => [
'routes' => [
'mandant' => [
'type' => Segment::class,
'options' => [
'route' => '/mandant[/:action[/:id[/:page]]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[a-zA-Z0-9\-]*',
],
'defaults' => [
'controller' => Controller\MandantController::class,
'action' => 'index',
],
],
],
'paginator' => [
'type' => 'segment',
'options' => [
'route' => '/list/[page/:page]',
'defaults' => [
'page' => 1,
],
],
],
],
],
这里的下一个问题:是否也需要修改 MandantController 的路由,或者有分页器路由就足够了吗?
这是我的 viewscript 的一部分,index.phtml:
foreach ($this->paginator->getCurrentItems() as $mandant) :?>
<tr>
<td><?= $this->escapeHtml($mandant['somefield']) ?></td>
</tr>
<?php endforeach;
echo $this->paginator, 'Sliding', 'pagination/control', array('route' => 'mandant')
?>
这里的下一个问题,我把分页器对象给了一个数组,因为数组适配器,但我真的更喜欢有一个对象而不是数组,这可能吗,还是我必须使用另一个适配器?
最后一个问题:是不是一切都完成了,还是我遗漏了什么地方?
编辑 1:
我进一步尝试了一下,现在已更改为 DbSelect Adapter,但似乎我的 tableadapter 不会被接受。这是我现在改变的:
xyzController.php
$page = $this->params()->fromRoute('page');
$countQuery = new Select();
$countQuery
->from('t_mandant')
->columns([ DbSelect::ROW_COUNT_COLUMN_NAME => 'id' ]);
$paginator= new Paginator(new DbSelect($this->mandantTable->Ansprechpartnerjoin(),null, $countQuery));
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(20);
$paginator->setPageRange(5);
return new ViewModel([
'paginator' => $paginator,
]);
错误信息:
Argument 1 passed to Zend\Paginator\Adapter\DbSelect::__construct()
must be an instance of Zend\Db\Sql\Select, instance of
Zend\Db\ResultSet\ResultSet given
这当然是对的,我的问题是,我必须做什么,才能将tableAdapter实例交给paginator构造函数。
现在我换了一个方案。我在我的模型中构建分页器。
现在看起来是这样的:
$resultSetprototype=new ResultSet();
$resultSetprototype->setArrayObjectPrototype(new Mandant());
$paginatorAdapter= new DbSelect($select, $this->tableGateway->getAdapter(), $resultSetprototype);
$paginator=new Paginator($paginatorAdapter);
return $paginator;
现在效果很好。
我是第一次使用分页器,现在我对如何以及在何处做事有一些疑问。
这是我的想法,下面是一些代码。
我了解在我的控制器操作中反对分页器,将对象提供给我的数据收集并将其提供给我的 ViewModel 对象。
因为我收到有关 ArrayAdapter 的错误,所以我将 post 错误和我的控制器中的使用语句 class。
错误:
Class 'Stammdaten\Controller\ArrayAdapter' not found
xyzController.php
use Zend\Paginator\Adapter\AdapterInterface;
use Zend\Paginator\Paginator;
use Zend\Paginator\ScrollingStyle\Sliding;
public function indexAction()
{
$page = $this->params()->fromRoute('page');
$paginator= new Paginator(new ArrayAdapter($this->mandantTable->Ansprechpartnerjoin()->toArray()));
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(20);
$paginator->setPageRange(5);
return new ViewModel([
'paginator' => $paginator,
]);
}
这里的第一个问题:这个适配器是正确的吗,因为我给了一个tableadapter集合,还是我必须换成另一个适配器?
我修改了使用分页器的路由,如下所示:
module.config.php
'router' => [
'routes' => [
'mandant' => [
'type' => Segment::class,
'options' => [
'route' => '/mandant[/:action[/:id[/:page]]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[a-zA-Z0-9\-]*',
],
'defaults' => [
'controller' => Controller\MandantController::class,
'action' => 'index',
],
],
],
'paginator' => [
'type' => 'segment',
'options' => [
'route' => '/list/[page/:page]',
'defaults' => [
'page' => 1,
],
],
],
],
],
这里的下一个问题:是否也需要修改 MandantController 的路由,或者有分页器路由就足够了吗?
这是我的 viewscript 的一部分,index.phtml:
foreach ($this->paginator->getCurrentItems() as $mandant) :?>
<tr>
<td><?= $this->escapeHtml($mandant['somefield']) ?></td>
</tr>
<?php endforeach;
echo $this->paginator, 'Sliding', 'pagination/control', array('route' => 'mandant')
?>
这里的下一个问题,我把分页器对象给了一个数组,因为数组适配器,但我真的更喜欢有一个对象而不是数组,这可能吗,还是我必须使用另一个适配器?
最后一个问题:是不是一切都完成了,还是我遗漏了什么地方?
编辑 1: 我进一步尝试了一下,现在已更改为 DbSelect Adapter,但似乎我的 tableadapter 不会被接受。这是我现在改变的:
xyzController.php
$page = $this->params()->fromRoute('page');
$countQuery = new Select();
$countQuery
->from('t_mandant')
->columns([ DbSelect::ROW_COUNT_COLUMN_NAME => 'id' ]);
$paginator= new Paginator(new DbSelect($this->mandantTable->Ansprechpartnerjoin(),null, $countQuery));
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(20);
$paginator->setPageRange(5);
return new ViewModel([
'paginator' => $paginator,
]);
错误信息:
Argument 1 passed to Zend\Paginator\Adapter\DbSelect::__construct() must be an instance of Zend\Db\Sql\Select, instance of Zend\Db\ResultSet\ResultSet given
这当然是对的,我的问题是,我必须做什么,才能将tableAdapter实例交给paginator构造函数。
现在我换了一个方案。我在我的模型中构建分页器。
现在看起来是这样的:
$resultSetprototype=new ResultSet();
$resultSetprototype->setArrayObjectPrototype(new Mandant());
$paginatorAdapter= new DbSelect($select, $this->tableGateway->getAdapter(), $resultSetprototype);
$paginator=new Paginator($paginatorAdapter);
return $paginator;
现在效果很好。