我正在使用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)
{% for item in items %}
{{ loop.index }}/{{ loop.length }}
{% endfo %}
输出错误,特别是loop.length
指的是整个集合(不是当前的项目集)。因此,例如,您无法使用loop.last
:
1/8
2/8
3/8
4/8
5/8
答案 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) }}">«</a>
</li>
{% if currentPage != 1 %}
<li>
<a href="{{ path(route, {'page': (currentPage - 1)}) }}">‹</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)}) }}">›</a>
</li>
{% endif %}
<li>
<a href="{{ path(route, {'page': totalPages}) }}">»</a>
</li>
</ul>
</div>
其中route
是'route_to_your_controller'
。
答案 2 :(得分:0)
Doctrine2 Paginator的页面确实提供了很多。我也找不到
学说\ ORM \工具\分页\分页程序;
您下载了其他文件吗?我真的想用你的答案而不是一些可用的包。