1

我正在使用Doctrine 2 Paginator并且我遇到了 Twig 的错误(可能)。考虑一个简单的Paginator初始化:

    $current = 1;
    $limit   = 5;
    $offset  = ($current - 1) * $limit;

    $qb->setFirstResult($offset)->setMaxResults($this->limit);

    // No fetch joins
    $items = new \Doctrine\ORM\Tools\Pagination\Paginator($qb->getQuery, false);

    // Total count
    var_dump($items->count()); // Prints 8

    // Number of items displayed
    var_dump(count($items)); // Prints 5

    // Items
    foreach($items as $item) :
        var_dump($items->getId()); // Prints 1, 2, 3, 4, 5
    endif;

计数对我来说很好。但是在将其分配给 Twig 之后array('items' => $items)

{% for item in items %}
    {{ loop.index }}/{{ loop.length }}
{% endfo %}

输出是错误的,特别loop.length是指整个集合(不是当前的项目集)。因此,例如,您不能使用loop.last

1/8
2/8
3/8
4/8
5/8
4

3 回答 3

2

自答。Doctrine 文档中的这段代码让我误入歧途:

$paginator = new Paginator($query, $fetchJoinCollection = true);

$c = count($paginator);
foreach ($paginator as $post) {
    echo $post->getHeadline() . "\n";
}

错误的。您必须将迭代器分配给 Twig,而不是分页器实例本身:

return array('items' => $paginator->getIterator());

编辑:对不起,我发现了count($paginator) == $paginator->count(),所以当前项目计数是$paginator->getIterator()->count()

于 2012-07-20T15:50:32.127 回答
1

只是为了扩展@gremo 所说的内容,对于一个简单的寻呼机(如果您不自豪!),您可以在控制器中执行以下操作:

$em = $this->getDoctrine()->getManager();
// Select your items.
$dql = "SELECT i FROM ShopBundle:Issue i ORDER BY i.liveDate DESC";
// Limit per page.
$limit = 10;
// See what page we're on from the query string.
$page = $this->getRequest()->query->get("page", 1);
// Determine our offset.
$offset = ($page - 1) * $limit;
// Create the query
$query = $em->createQuery($dql);
$query->setFirstResult($offset)->setMaxResults($limit);
// Create a pager object.
$paginator = new Paginator($query, $fetchJoinCollection = FALSE);
...
return $this->render('ShopBundle:Issue:list.html.twig', array(
    'totalPages' => (int) ($paginator->count() / $limit), // Calc total number of pages.
    'currentPage' => $page,
    'issues' => $paginator->getIterator(),
    )
);

然后在模板中(作为树枝包括):

<div class="pagination">
    <ul>
        <li>
            <a href="{{ path(route) }}">&laquo;</a>
        </li>
        {% if currentPage != 1 %}
        <li>
            <a href="{{ path(route, {'page': (currentPage - 1)}) }}">&lsaquo;</a>
        </li>
        {% endif %}
        {% for i in 1..totalPages %}
        <li>
            <a{% if  i == currentPage %} class="disabled"{% endif %} href="{{ path(route, {'page': i}) }}">{{ i }}</a>
        </li>
        {% endfor %}
        {% if currentPage != totalPages %}
        <li>
            <a href="{{ path(route, {'page': (currentPage + 1)}) }}">&rsaquo;</a>
        </li>
        {% endif %}

        <li>
            <a href="{{ path(route, {'page': totalPages}) }}">&raquo;</a>
        </li>
    </ul>
</div>

route在哪里'route_to_your_controller'

于 2014-03-28T17:10:06.257 回答
0

Doctrine2 Paginator 的页面确实提供了很多。我也找不到

教义\ORM\工具\分页\分页器;

您是否下载了其他文件?我真的很想使用您的答案,而不是一些可用的捆绑包。

于 2012-08-08T01:14:08.150 回答