Paginación en cakePHP: Paginator (componente en controladores)

Para poder ver todos los registros de nuestra base de datos con paginación y posibilidad de ordenar, cakePHP nos ofrece el componente ‘Paginator’. Para usarlo basta con indicarlo en el controlador:

 public $components = array('Paginator');

Y podemos configurar diferentes opciones:

 public $paginate = array(
        'fields' => array('Post.id', 'Post.created'),
        'limit' => 25,
        'order' => array(
            'Post.title' => 'asc'
        )
    );

Para usarlas lo tendremos que indicar en la acción del controlador:

 public function index() {
 $this->Actor->recursive = 0;
 $this->Paginator->settings = $this->paginate;
 $this->set('actors', $this->Paginator->paginate( );
 }

En el index habitualmente ponemos la opción ‘recursive’ a 0 para que no nos devuelva los registros relacionados. Si queremos usar las opciones modificadas del paginador lo indicamos en settings. Y para obtener los registros basta con llamar a la función ‘paginate’.

También podemos pasar condiciones a la hora de paginar:

 public function index() {
 $this->Actor->recursive = 0;
 $this->Paginator->settings = $this->paginate;
 $this->set('actors', $this->Paginator->paginate( array('first_name LIKE' => 'a%')));
 }

En este caso nos muestra los actores cuyo nombre empieza por ‘a’.

Recuperar datos

find

find($tipo, $parametros)

$tipo es 'all', 'first', 'count', 'neighbors', 'list' o 'threaded'. 'first' es el tipo de búsqueda predeterminado.

$parametros es un array con cualquiera de las siguientes opciones disponibles como claves:

array(
    'conditions' => array('Model.field' => $thisValue), //array de condiciones
    'recursive' => 1, //int
    'fields' => array('Model.field1', 'Model.field2'), //array de nombres de campos
    'order' => 'Model.created', //string o array definiendo el orden
    'group' => array('Model.field'), //campos para GROUP BY
    'limit' => n, //int
    'page' => n //int
)

find(‘first’)

find(‘first’, $params)

‘first’ es el tipo find por defecto, y devolverá un solo resultado, deberías utilizar esto para cualquier caso donde esperes solo un resultado.

find(‘count’)

find('count', $params)

find('count', $params) Devuelve un valor entero.

find(‘all’)

find('all', $params)

find('all')devuelve un array de resultados(potencialmente multiple); es, de hecho, el mecanismo usado por todas las variantes del método find(), como por ejemplo para paginar.

find(‘list’)

find('list', $params)

find('list', $params) Devuelve un array indexado, útil para cualquier uso donde podrías querer una lista como los polulares campos select de los formularios

find(‘neighbors’)

find('neighbors', $params)

‘neighbors’ realiza una búsqueda similar a ‘first’, a diferencia que devuelve el registro precedente y posterior del solicitado.

query

query(string $consulta)

Se pueden realizar llamadas SQL personalizadas usando el método query() del modelo.

Controlador + vista en cakePHP

Creamos el controlador Prueba:

App::uses('AppController', 'Controller');

/**
 * CakePHP PruebaController
 * @author a4alumno
 */
class PruebaController extends AppController {

 public function index() {
 die("Hasta aquí hemos legado");
 }

 public function saludo($nombre,$apellidos="") {
 $this->set('nombre',$nombre);
 $this->set('apellidos',$apellidos);
 $this->set('nombrecompleto',$apellidos.", ".$nombre);
 }
 
 public function suma($a,$b){
 $this->set('suma',$a+$b);
 }

 public function mayor($a,$b){
 if ($a<$b) $a=$b;
 $this->set('mayor',$a);
 }
}

En el ejemplo anterior tenemos las acciones: saludo, suma y mayor. Necesitaríamos una vista para cada una de ellas:

//archivo en View\Prueba\saludo.ctp

<h2><?=$nombrecompleto?></h2>
<h1>Hola que tal?</h1>
<?php

echo $nombre." ".$apellidos;
//archivo en View\Prueba\suma.ctp

<h2>La suma es <?=$suma?></h2>
//archivo en View\Prueba\mayor.ctp

<h2>El mayor es <?=$mayor?></h2>