Zend Framework 2 Paginator + TableGateway

前端 未结 5 1108
悲哀的现实
悲哀的现实 2021-01-03 12:02

How to use the database mapper with the paginator?

I\'m having a bit trouble understanding how I implement the DbSelect paginator using the code below (right now i

相关标签:
5条回答
  • 2021-01-03 12:29

    but I'm having trouble getting a Select object out from my TableGateway without duplicating my query code. Is there an easy way to solve this problem?

    You can get the select object inside you NewsContentsTable class like this:

    $this->getSql()->select();
    
    0 讨论(0)
  • 2021-01-03 12:36

    Here is sample code for pagination in ZF2

     <?php
        //var/www/html/zend_app/module/Application/src/Application/Controller/Plugin/MyCustomPlugin.php
        namespace Application\Controller\Plugin;
    
        use Zend\View\Helper\AbstractHelper;
    
        use Zend\Db\Adapter\Adapter;
        use Zend\Db\ResultSet\ResultSet;
        use Zend\Db\Sql\Select;
        use Zend\Db\Sql\Sql;
        use Zend\Db\Sql\Where;
    
        use Zend\Mvc\Controller\Plugin\AbstractPlugin;
    
        use Zend\Paginator\Paginator;
        use Zend\Paginator\Adapter\Iterator as paginatorIterator;
        use Zend\Paginator\Adapter\DbSelect;
    
        class MyCustomPlugin extends AbstractPlugin {
    
            protected $adapter;
    
            public function __construct(\Zend\Db\Adapter\Adapter $adapter) {
                $this->adapter = $adapter;
            }
    
    
    
    
             public function getPaginatedTableData($tableName, $whereData = "", $selectedColumn = '' , $currentPageNumber = 1) {
    
                $sql = new Sql($this->adapter);
                $select = $sql->select();
    
                if ($selectedColumn) {
                    $select->columns($selectedColumn);
                }
                $select->from($tableName);
                if ($whereData) {
                    $select->where($whereData);
                }
    
                $paginator = $this->getPaginatorForSelect($select, $currentPageNumber);
    
    
                $resultSet = new ResultSet;
                $resultSet->initialize($paginator);
                $resultSet->buffer();
    
                  $pagination = array(
                   'current_page_number'=>$currentPageNumber,
                   'page_count'=>$paginator->getPages()->pageCount,
                   'previous'=>isset($paginator->getPages()->previous)?$paginator->getPages()->previous:0,
                   'next'=>isset($paginator->getPages()->next)?$paginator->getPages()->next:0,
                   );
    
    
     return ($resultSet &&  0 != $paginator->getPages()->pageCount)?array('resultSet'=>$resultSet->toArray(), 'pagination'=>$pagination):FALSE;
    
            }
    
    
    
    
            public function getPaginatorForSelect($select, $page, $limit=2)
        {
        $paginatorAdapter = new DbSelect($select, $this->adapter);
        $paginator = new Paginator($paginatorAdapter);
        $paginator->setItemCountPerPage($limit);
        $paginator->setPageRange(5);
        $paginator->setCurrentPageNumber($page);
        return $paginator;
        }
    
        }
    

    HTH

    0 讨论(0)
  • 2021-01-03 12:39

    Implementing paginator with DbSelect as the adapter

    // controller
    public function articleAction()
    {
        //...
        $paginator = $this->newsContents()->getPages($this->articleId());
        $paginator->setCurrentPageNumber($this->params()->fromRoute('page'));
    
        return array(
            'css'       => 'news.css',
            'article'   => $article,
            'paginator' => $paginator,
        );
    }
    ?>
    
    // table
    public function getPages($newsId)
    {
        $sql = $this->getSql();
        $select = $sql->select();
        $select->where(array('news_id' => $newsId))->order('id ASC');
        $adapter = new \Zend\Paginator\Adapter\DbSelect($select, $sql);
        $paginator = new \Zend\Paginator\Paginator($adapter);
        return $paginator;
    }
    
    0 讨论(0)
  • 2021-01-03 12:42

    Use buffer() and next() before return in $rowset.

    $rowset->buffer();
    $rowset->next();
    
    return $rowset;
    
    0 讨论(0)
  • 2021-01-03 12:45

    From Zend Framework 2.2 its much easier (and allows you to fully enjoy the advantages offered by the TableGateway) - you should use

    use Zend\Db\TableGateway\TableGateway;
    use Zend\Paginator\Paginator;
    use Zend\Paginator\Adapter\DbTableGateway;  // !!!
    
     
    $dbTableGatewayAdapter = new DbTableGateway($this->tableGateway);
    $paginator = new Paginator($dbTableGatewayAdapter);
    return $paginator;
    
    0 讨论(0)
提交回复
热议问题