代码之家  ›  专栏  ›  技术社区  ›  pia-sophie

使用分页器

  •  0
  • pia-sophie  · 技术社区  · 7 年前

    我第一次使用paginator,现在我有一些问题如何以及在哪里做事情。

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

    我理解在控制器操作中使用对象分页器,将对象交给我的数据集合,并将此交给我的ViewModel对象。

    因为我得到一个关于ArrayAdapter的错误,所以我也会在controller类中发布这个错误和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的路由,或者有paginator路由就足够了?

    这里是我的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')
    ?>
    

    下一个问题是,由于array adapter,我把paginator对象给了一个数组,但是我真的更希望有一个对象而不是一个数组,这是可能的,还是我必须使用另一个适配器?

    最后一个问题是:一切都完成了还是我遗漏了什么?

    编辑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::\uu construct() 必须是Zend\Db\Sql\Select的实例,的实例 给定Zend\Db\ResultSet\ResultSet

    当然,这是对的,我的问题是,我必须做什么,才能将tableAdapter实例提供给paginator构造函数。

    1 回复  |  直到 7 年前
        1
  •  0
  •   pia-sophie    7 年前

    现在我换了另一个解决方案。我在模型中构造了分页器。

    现在看来如下:

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

    现在它工作得很好。

    推荐文章