如何在Doctrine Zend Framework 3中添加分页 [英] How to add paging in Doctrine Zend Framework 3

查看:106
本文介绍了如何在Doctrine Zend Framework 3中添加分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经添加了paginator.phtml文件,并且在控制器中添加了一些代码

I've already added paginator.phtml file and I have added some code in controller

$adapter = new DoctrineAdapter(new ORMPaginator( $logList , false));
$paginator = new Paginator($adapter);
$paginator->setDefaultItemCountPerPage(10);        
$paginator->setCurrentPageNumber(1);
return new ViewModel(['logList'=>$logList ,'form'=>$form,'posts' => $paginator]);

在查看页面上,我正在使用以下代码:

On the view page I'm using this code:

$this->paginationControl($posts,
  'Sliding',
  'ripple-site/partial/paginator', 
  ['route' => 'ripplesite']
);

此代码产生错误:

传递给Doctrine \ ORM \ Tools \ Pagination \ Paginator :: cloneQuery()的参数1必须是Doctrine \ ORM \ Query的实例,给定数组,在C:\ zend \ vendor \ doctrine \ orm \ lib \中调用244行上的Doctrine \ ORM \ Tools \ Pagination \ Paginator.php

Argument 1 passed to Doctrine\ORM\Tools\Pagination\Paginator::cloneQuery() must be an instance of Doctrine\ORM\Query, array given, called in C:\zend\vendor\doctrine\orm\lib\Doctrine\ORM\Tools\Pagination\Paginator.php on line 244

推荐答案

现在做了几次,所以我将为您提供基本的indexAction. (请注意OrmPaginator中加载的内容的不同,这可能是您遇到的问题)

Done this a few times now, so I'll provide you with a basic indexAction. (Note the difference in what's loaded into the OrmPaginator, which is probably your issue)

use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Tools\Pagination\Paginator as OrmPaginator;
use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as OrmAdapter;

// class

public function indexAction()
{
    $page           = $this->params()->fromQuery('page', 1);                          // default page
    $pageSize       = $this->params()->fromQuery('pageSize', 10);                    // default page size
    $orderBy        = $this->params()->fromQuery('orderBy', 'createdAt');            // default order by (replace with your own property name!)
    $orderDirection = $this->params()->fromQuery('orderDirection') === Criteria::ASC // default order direction (desc to display newest first - replace with your own)
        ? Criteria::ASC
        : Criteria::DESC;

    $criteria = (new Criteria())
        ->setFirstResult($page * $pageSize)
        ->setMaxResults($pageSize)
        ->orderBy([$orderBy => $orderDirection]);

    /** @var QueryBuilder $qb */
    $qb = $this->getObjectManager()->createQueryBuilder();
    $qb->select('a')                          // replace with your own alias key
       ->from(Article::class, 'a')            // replace with your own class and alias
       ->addCriteria($criteria);

    $paginator = new Paginator(new OrmAdapter(new OrmPaginator($qb)));
    $paginator->setCurrentPageNumber($page);
    $paginator->setItemCountPerPage($pageSize);

    return [
        'paginator'   => $paginator,
        'queryParams' => $this->params()->fromQuery(),
    ];
}

要求类具有ObjectManager的实例.如果使用$entityManager,那很好,只需将$this->getObjectManager()替换为$this->getEntityManager()$this->entityManager.

Requirements are that the class has the an instance of ObjectManager. If you use $entityManager, that's fine, just replace $this->getObjectManager() with $this->getEntityManager() or $this->entityManager.

其余的应该开箱即用.

The rest should work out of the box.

对于此控制器->操作,在index.phtml中显示为

Display like so in index.phtml for this controller->action

<?php
/** @var \Article\Entity\Article[] $paginator */

$pagination = $this->paginationControl(
    $paginator,
    'sliding',
    'theme/partials/pagination',            // This here assumes you have a partial setup for pagination. If not, leave a comment and I can add a default Bootstrap 4 compatible one. 
    [
        'route'       => 'admin/articles',
        'queryParams' => $queryParams,
    ]
);

<?php if (isset($paginator) && $paginator->count() > 0) : ?>
    <table class="table table-striped">
        <thead>
        <tr>
            <th><?= $this->translate('Title') ?></th>
            <!-- more columns -->
        </tr>
        </thead>

        <tbody>
        <?php foreach ($paginator as $article): ?>
            <tr>
                <td>
                    <?= $this->escapeHtml($article->getTitle()) ?>
                </td>
                <!-- more columns -->
            </tr>
        <?php endforeach ?>

        </tbody>
    </table>

    <?php if ($paginator->count() > 1) : ?>
        <?= $pagination ?>
    <?php endif ?>
<?php else : ?>
    <p><?= $this->translate('No records found. Try again later or report an issue.') ?></p>
<?php endif ?>

这篇关于如何在Doctrine Zend Framework 3中添加分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆