View para Pagerfanta compatible con Bootstrap

Existe un bundle de Symfony 2 para paginar contenido llamado Pagerfanta ( Symfony2bundles, Github ). En la documentación se describe como se usa. Incorpora una vista por defecto a la que se le pueden pasar algunos parametros para cambiar ciertos aspectos básicos del paginador. Además proporciona una interfaz para crear tus propias vistas.

Bootstrap ( de Twitter ) es un toolkit para facilitar el desarrollo de aplicaciones web sin tener que complicarse demasiado con el estilo. Como se puede ver en la web ofrece un CSS, que además de ayudarnos con la estructura, podremos usar con un montón de componentes. Uno de estos componentes es un típico paginador.

Aprovechando las ventajas que nos dan estos dos prácticos proyectos, he cambiado un poco la vista por defecto de Pagerfanta para que renderice el HTML que renderiza se ajuste al CSS de Bootstrap.

 

[code]

/*
* This file is part of the Pagerfanta package.
*
* (c) Pablo Díez <pablodip@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace …PagerfantaView;

use PagerfantaPagerfantaInterface;

/**
* DefaultInterface.
*
* @author Pablo Díez <pablodip@gmail.com>
*
* @api
*/
class BootstrapView implements PagerfantaViewViewInterface
{
/**
* {@inheritdoc}
*/
public function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array())
{
$options = array_merge(array(
‘proximity’ => 3,
‘previous_message’ => ‘&larr; Anterior’,
‘next_message’ => ‘Siguiente &rarr;’,
‘css_current_class’ => ‘current’,
), $options);

$currentPage = $pagerfanta->getCurrentPage();

$startPage = $currentPage – $options[‘proximity’];
$endPage = $currentPage + $options[‘proximity’];

if ($startPage < 1) {
$endPage = min($endPage + (1 – $startPage), $pagerfanta->getNbPages());
$startPage = 1;
}
if ($endPage > $pagerfanta->getNbPages()) {
$startPage = max($startPage – ($endPage – $pagerfanta->getNbPages()), 1);
$endPage = $pagerfanta->getNbPages();
}

$pages = array();

// previous
if ($pagerfanta->hasPreviousPage()) {
$pages[] = array($pagerfanta->getPreviousPage(), $options[‘previous_message’]);
} else {
$pages[] = sprintf(‘<li class=”%s prev”><a href=”#”>%s</a></li>’, ‘disabled’, $options[‘previous_message’]);
}

// first
if ($startPage > 1) {
$pages[] = array(1, 1);
if (3 == $startPage) {
$pages[] = array(2, 2);
} elseif (2 != $startPage) {
$pages[] = sprintf(‘<li class=”disabled”><a href=”#”>…</a></li>’);
}
}

// pages
for ($page = $startPage; $page <= $endPage; $page++) {
if ($page == $currentPage) {
$pages[] = sprintf(‘<li class=”active”><a href=”#”>%s</a></li>’,$page);
} else {
$pages[] = array($page, $page);
}
}

// last
if ($pagerfanta->getNbPages() > $endPage) {
if ($pagerfanta->getNbPages() > ($endPage + 1)) {
if ($pagerfanta->getNbPages() > ($endPage + 2)) {
$pages[] = sprintf(‘<li class=”disabled”><a href=”#”>…</a></li>’);
} else {
$pages[] = array($endPage + 1, $endPage + 1);
}
}

$pages[] = array($pagerfanta->getNbPages(), $pagerfanta->getNbPages());
}

// next
if ($pagerfanta->hasNextPage()) {
$pages[] = array($pagerfanta->getNextPage(), $options[‘next_message’]);
} else {
$pages[] = sprintf(‘<li class=”disabled”><a href=”#”>%s</a></li>’, $options[‘next_message’]);
}

// process
$pagesHtml = ”;
foreach ($pages as $page) {
if (is_string($page)) {
$pagesHtml .= $page;
} else {
$pagesHtml .= ‘<li><a href=”‘.$routeGenerator($page[0]).'”>’.$page[1].'</a></li>’;
}
}

return ‘<nav class=”pagination”><ul>’.$pagesHtml.'</ul></nav>’;
}

/**
* {@inheritdoc}
*/
public function getName()
{
return ‘Bootstrap’;
}
}
[/code]