Paginación con ordenación por columna y buscador

Hoy vamos a hablar de cómo introducir en nuestro diseño web la paginación en CakePHP 1.2, introduciéndole un buscador. Utilizaremos una tabla para visualizar los datos, añadiéndole la opción de ordenarla pinchando en las cabeceras.

Utilizaremos para ello el Paginator Helper que viene implementado en esta nueva versión y que, como veremos, hace muchísimo más fácil esta tarea.

Empezamos con el controlador. Lo primero que tenemos que hacer es añadir dos variables:

PHP:
  1. var $paginate = array('limit' =>10, 'page' =>1, 'order'=>array('Modelo.campo ASC'))
  2. var $components = array('RequestHandler');

como vemos en las opciones del array, le especificamos en la variable limit el número de elementos por página, en page la página en la que empezamos y en order la ordenación inicial. El componente RequestHandler no sería necesario si no introducimos el buscador.

El siguiente paso es crear una función de la manera siguiente:

PHP:
  1. function admin_listar()
  2. {
  3. if(!$this->RequestHandler->isAjax())
  4. {
  5. $this->set('llamada_ajax', 0);
  6. $this->Session->del($this->name.'.search');
  7. }if (isset($this->data['Modelo']['cadena_busqueda']))
  8. {
  9. $str = trim($this->data['Modelo']['cadena_busqueda']);
  10. } elseif (!empty($this->data['Modelo']['cadena_busqueda']) &&
  11. $this->data['Modelo']['cadena_busqueda'] == '')
  12. {
  13. $this->Session->del($this->name.'.search');
  14. } elseif ($this->Session->check($this->name.'.search')) {
  15. $str = $this->Session->read($this->name.'.search')
  16. }  $condicion = '';
  17. if (isset($str))
  18. {
  19. $condicion = "Modelo.campo LIKE \"%$str%\"";   // Podemos poner la condición que nos interese
  20. $this->Session->write($this->name.'.search', $str);
  21. }
  22. $this->set('resultado', $this->paginate('Modelo', $condicion));
  23.  
  24. if($this->RequestHandler->isAjax())
  25. {
  26. $this->set('llamada_ajax', 1);
  27. $this->render('admin_listar', 'ajax');
  28. }
  29. }

Utilizaremos la sesión para guardar la cadena de búsqueda y no perderla cuando pulsemos en las cabeceras para la ordenación.

Y la vista sería ("admin_listar.ctp"):

PHP:
  1. if (!$llamada_ajax)
  2. {
  3. echo $form->create('Modelo',array('action'=>'', 'id'=>'buscar'));
  4. echo $form->input('Modelo.cadena_busqueda', array('id'=>'cadena_busqueda', 'label'=>'Búsqueda'))$options = array('frequency'=>'2', 'url' => 'listar', 'update' => 'listado',
  5. 'loading' => 'Element.show(\'LoadingDiv\')',
  6. 'complete' => 'Element.hide(\'LoadingDiv\')')
  7. echo $ajax->submit('Buscar',$options);
  8.  
  9. echo $form->end();
  10.  
  11. echo $html->div(null, $html->image('ajax-loader.gif'), array('id'=>'LoadingDiv', 'style'=>'display: none;'))
  12. }
  13.  
  14. $paginator->options( array('update'=>'listado',
  15. 'url'=>array('controller'=>'nombre_controlador', 'action'=>'listar') ,
  16. 'indicator' => 'LoadingDiv'));
  17.  
  18. if (count($resultado)>0)
  19. {
  20. echo "Página ".$paginator->counter(array('separator'=>' de '));
  21.  
  22. echo $html->table('listado');
  23. echo "<thead class='cabecera'>";
  24. echo "<tr><th>".$paginator->sort('Título cabecera', 'campo_modelo')."</th></tr>";
  25. echo "</thead>";
  26. foreach ($resultado as $elemento)
  27. {
  28. echo $html->tableCells( array ($elemento['Modelo']['campo_modelo']) );
  29. }
  30. echo $html->tableEnd();
  31.  
  32. echo $paginator->prev('Página anterior');
  33. echo $paginator->numbers(array('separator'=>' - '));
  34. echo $paginator->next('Página siguiente');
  35. } else {
  36. echo $html->para('clase','No se han encontrado resultados.');
  37. }

Vemos aquí que es el propio Paginator Helper el que, con una simple llamada a la función sort, ya se encarga de hacer la ordenación de la columna alternando en cada click entre ascendente y descendente.

La función counter nos devuelve una cadena con la página en la que nos encontramos y el número total de páginas, en nuestro caso introducimos la cadena ' de ', entre ellas.

Y por último, las tres últimas funciones utilizadas, prev, numbers y next, nos muestran los enlaces a la página previa, a cada una de las páginas y a la página siguiente, respectivamente.

CakePHP 1.2 nos proporciona muchas más posibilidades y muchas otras opciones. Podemos obtener más información en la especificación de CakePHP 1.2 del Paginator Helper. Así como en la Bakery, en la que tenemos un artículo sobre la paginación básica y otro sobre la avanzada.

Deja una respuesta

[ bbPress synchronization by bobrik ]