2015-12-16 2 views
0

Посмотрел документацию для этого, но не смог найти окончательного ответа на то, что мне нужно, поэтому не уверен, что это возможно, но этого я хочу достичь:Доктрина разбиения на страницы - ограничение количества отображаемых страниц?

У меня есть список клиентов, разбитый на страницы мой проект 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 
)); 

И мой файл веточка реализует пейджинг следующим образом:

{% 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 %} 

На данный момент, Paginator показывает все страницы, но в пару месяцев, когда может быть вдвое больше клиентов, количество страниц будет переполняться на экране и выглядеть беспорядочно. Мне интересно, есть ли способ ограничить количество страниц, отображаемых в любой момент в блоке разбиения на страницы, так что, например, он отображает 10 страниц, но когда вы нажимаете на страницу, в которой она больше загружается, в качестве примера:

[< <] [1] [2] [3] ... [20] [21] [22] [>>]

Затем при нажатии стр.3 может выглядеть как это:

< < [] [3] [4] [5] ... [20] [21] [22] [>>]

или что-то в этом роде?

Надеюсь, я объясню это достаточно хорошо!

Майкл

ответ

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 %} 

Надеется, что это поможет.

0

Не усложняйте себя, используйте https://github.com/KnpLabs/KnpPaginatorBundle, очень проста в использовании и все шаблоны настраиваются. Уже интегрированы с загрузкой 2 и 3. Если вы предпочитаете, вы можете использовать другие, но это сработало для меня много раз.