Hola, luego de casi 3 días de lectura extrema e intentos fallidos, logré dominar
la técnica de paginar elementos de un sitio mediante sfPropelPager.
En el controlador tenemos la siguiente acción:
public function executeMostrar() {
//Defino un paginador para la clase ‘Mensaje’ . Quiero 10 resultados por página.
$pager = new sfPropelPager(‘Mensaje’, 10);
//Defino ‘criteria’, en este caso traigo TIPO=’informes’ y ordenados
de mayor a menor por ID
$c = new Criteria();
$c->add(MensajePeer::TIPO, ‘informe’, Criteria::LIKE);
$c->addDescendingOrderByColumn(MensajePeer::ID);
$pager->setCriteria($c);
//Seteo la primera página a uno
$pager->setPage($this->getRequestParameter(‘page’, 1));
$pager->init();
// Preparo la información para usarla en la vista.
$this->pager = $pager;
}
Luego, en la vista debo reemplazar en el «foreach» con el que venía listando sin paginar, la variable que traía los datos desde el controlador por el nuevo paginador, de esta manera:
<?php foreach( $pager->getResults() as $elemento): ?>
<?php echo «El nombre de este elemento es:».$elemento->getNombre(); ?>
<?php endforeach; ?>
Para mostrar los números y las flechas de la paginación, usamos este código:
<?php if ($pager->haveToPaginate()): ?>
<?php echo link_to(‘«’, ‘log/mostrar?page=’.$pager->getFirstPage()) ?>
<?php echo link_to(‘<’, ‘log/mostrar?page=’.$pager->getPreviousPage()) ?>
<?php $links = $pager->getLinks();
foreach ($links as $page): ?>
<?php echo ($page == $pager->getPage()) ? $page : link_to($page, ‘log/mostrar?page=’.$page) ?>
<?php if ($page != $pager->getCurrentMaxLink()): ?> – <?php endif ?>
<?php endforeach ?>
<?php echo link_to(‘>’, ‘log/mostrar?page=’.$pager->getNextPage()) ?>
<?php echo link_to(‘»’, ‘log/mostrar?page=’.$pager->getLastPage()) ?>
<?php endif ?>
No te olvides de reemplazar ‘Módulo/acción’ (en el ejemplo log/mostrar) con tu módulo y tu acción.
Queda muy bien mostrar un encabezado con la información total del listado, así:
<?php echo $pager->getNbResults().» Elementos encontrados. Mostrando resultados desde «.$pager->getFirstIndice().» hasta «.$pager->getLastIndice(); ?>
Costó mucho pero quedó funcionando a la perfección.
saludos.