学说分页 - 限制显示的页数?

时间:2015-12-16 09:59:37

标签: symfony doctrine-orm pagination paging

看一下这方面的文档,但找不到我需要的确切答案,所以不确定是否可能,但这是我想要实现的目标:

我有一个在我的Symfony2项目中分页的客户端列表。目前数据库中有几百个但预计会增长。目前有22页的客户端和我正在使用的分页是标准的Doctrine2分页。我在控制器中显示客户端的功能如下:

$em = $this->getDoctrine()->getManager();
$client_repo = $em->getRepository('AppBundle:Clients');
$clients = $client_repo->findByAccountStatus($status);
$message = false;
$page = $request->get('page');
$total_clients = count($clients);
$per_page = 20;
$total_pages = ceil($total_clients/$per_page);

if (!is_numeric($page)) {
    $page = 1;
} else {
    $page = floor($page);
}
if ($total_clients <= $per_page) {
    $page = 1;
}
if (($page * $per_page) > $total_clients) {
    $page = $total_pages;
}
$offset = 0;
if ($page > 1) {
    $offset = $per_page * ($page - 1);
}

$dql = "SELECT c FROM AppBundle:Clients c WHERE c.accountStatus = '".$status."'";
$query = $em->createQuery($dql)
    ->setFirstResult($offset)
    ->setMaxResults($per_page);

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


return $this->render('AppBundle:tables:clientstable.html.twig', array(
    'clients' => $paginator,
    'total_pages' => $total_pages,
    'current_page' => $page
));

我的twig文件按如下方式实现分页:

{% if total_pages > 1 %}
<div class="text-center">
    <ul class="pagination">
        {% for i in 1..total_pages %}
            {% if loop.first %}
                <li class="prev{% if current_page==1 %} disabled{% endif %}"><a href="{% if current_page>1 %}{{ path('app_show_clients', {'page':current_page-1}) }}{% else %}javascript:void(0){% endif %}">«</a></li>
            {% endif %}
                <li{% if current_page==loop.index %} class="active"{% endif %}><a href="{{ path('app_show_clients', {'page':loop.index}) }}">{{ loop.index }}</a></li>
            {% if loop.last %}
                <li class="next{% if current_page == total_pages %} disabled{% endif %}"><a href="{% if current_page < total_pages %}{{ path('app_show_clients', {'page':current_page+1}) }}{% else %}javascript:void(0){% endif %}">»</a></li>
            {% endif %}
        {% endfor %}
    </ul>
</div>
{% endif %}

目前,分页器显示所有页面,但是在几个月内,当前的客户端数量可能会增加一倍,屏幕上的页面数量会溢出并且看起来很混乱。我想知道的是,有没有办法限制分页块中任何时候显示的页面数量,例如,它显示10页但是当你点击页面时它会提供更多信息,例如:

  

[&lt;&lt;] [1] [2] [3] ... [20] [21] [22] [&gt;&gt;]

然后当您点击第3页时,它可能如下所示:

  

[&lt;&lt;] [3] [4] [5] ... [20] [21] [22] [&gt;&gt;]

或类似的东西?

希望我能够解释得这么好!

迈克尔

2 个答案:

答案 0 :(得分:1)

不要让自己变得复杂,使用https://github.com/KnpLabs/KnpPaginatorBundle,非常容易使用,并且所有模板都是可配置的。已经与bootstrap 2和3集成。如果您愿意,可以使用其他,但这对我很有用。

答案 1 :(得分:0)

您必须在视图中添加类似的内容:

{% for p in range(max(current_page-3, 1), min(current_page+3, total_pages)) %}
    <a {% if p == current_page %} class="current-page"{% endif %} href="{{ path('route_name', {'page': p})) }}">{{ p }}</a>
{% endfor %}

希望它会对你有所帮助。