使用分页器

时间:2018-08-03 11:04:38

标签: zend-framework zend-framework3 zend-paginator

我第一次使用分页器,现在我对如何操作以及在何处进行操作有疑问。

这是我的想法,并在一些代码下面。

我理解控制器动作中的对象分页器,将对象提供给我的数据集合,并将其提供给ViewModel对象。

因为收到有关ArrayAdapter的错误,我还将错误和我的use语句张贴在控制器类中。

错误:

  

找不到类'Stammdaten \ Controller \ ArrayAdapter'

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的路由,或者是否有足够的分页器路由?

这是我的部分视图脚本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')
?>

在这里的下一个问题,由于arrayadapter,我将分页程序对象分配给了一个数组,但是我确实更希望使用一个对象而不是一个数组,这是否可能,或者我是否必须使用另一个适配器?

最后一个问题:一切都做完了还是我在某个地方缺少什么?

编辑1: 我尝试了一下,现在已更改为DbSelect适配器,但看来我的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,

            ]);

错误消息:

  

参数1传递给Zend \ Paginator \ Adapter \ DbSelect :: __ construct()   必须是Zend \ Db \ Sql \ Select的实例,   Zend \ Db \ ResultSet \ ResultSet给定

这当然是正确的,我的问题是,要将tableAdapter实例提供给分页器构造函数,我该怎么办。

1 个答案:

答案 0 :(得分:0)

现在,我更改为另一种解决方案。我在模型中构造了分页器。

现在看起来如下:

 $resultSetprototype=new ResultSet();
        $resultSetprototype->setArrayObjectPrototype(new Mandant());
        $paginatorAdapter= new DbSelect($select, $this->tableGateway->getAdapter(), $resultSetprototype);
        $paginator=new Paginator($paginatorAdapter);
        return $paginator;

现在效果很好。