使用Doctrine 2 Paginator的Twig循环变量,这是一个错误吗?

时间:2012-07-20 11:25:58

标签: symfony doctrine-orm twig

我正在使用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;

对我来说这很好。但在使用array('items' => $items)

将其分配给Twig之后
{% for item in items %}
    {{ loop.index }}/{{ loop.length }}
{% endfo %}

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

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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'

答案 2 :(得分:0)

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

学说\ ORM \工具\分页\分页程序;

您下载了其他文件吗?我真的想用你的答案而不是一些可用的包。