Ordenar sin $paginator->sort

131 views
Skip to first unread message

hormigaz

unread,
Apr 15, 2009, 5:40:21 AM4/15/09
to CakePHP en Español
Hola buenas,
Estoy empezando con CakePHP y estoy intentando ordenar los registros
que tengo en la vista. Se hacerlo si tengo paginación, básicamente
porque el bake me lo hace solo, pero ahora quiero quitar la paginación
y ya no se cómo hacer que dándole a la cabecera de una columna (th) se
me ordene la tabla por el campo que he clicado.

La idea que yo tenía es que cuando accediera directamente a la vista
index de un modelo, ya me saliera esa tabla ordenada por el campo
nombre. Por defecto lo hacía por el campo id.

Mi controlador es este:
<?php
class ClientsController extends AppController {

var $name = 'Clients';
var $helpers = array('Html', 'Form');

function index() {
$this->Client->recursive = 0;
$busqueda = $this->Client->find('all', array('order'
=> 'name ASC'));
//print_r($busqueda);
//$this->set('clients', $this->paginate());
$this->set('clients', $busqueda);
}
}

?>

y parte de mi vista es esta:

<div class="clients index">
<h2><?php __('Clients');?></h2>
<table width="100%" cellspacing="0"
cellpadding="0">
<tr>
<th scope="col"><?
php //echo $paginator->sort('id');?></th>
<th scope="col"><?
php //echo $paginator->sort('Nom','name');?></th>
<th scope="col"><?
php //echo $paginator->sort('Localitat','locality');?></th>
<th scope="col"><?
php //echo $paginator->sort('Telèfon','phone');?></th>
<th scope="col"><?
php //echo $paginator->sort('email');?></th>
<th scope="col"><?php
__('Acció');?></th>
</tr>
...
como podeis ver ese TR es el típico tr que se crea con el Bake. El
tema está en ahora no tengo paginación y la página peta cuando accede
a $paginator.... Lo que me gustaría saber es como puedo ordenar las
columnas por el campo que quiera sin el $paginator->sort.

Muuuuuuchas gracias !
Hasta ahora.

Adrian Rivera

unread,
Apr 15, 2009, 12:42:50 PM4/15/09
to cakep...@googlegroups.com
Hola;

Mira la solución a tu problema es utilizar un complemento de jquery que hace lo que tu quieres, aca te dejo el link para que lo mires http://tablesorter.com/docs/

Cordialmente;

Adrian Rivera
Cel: 311 644 6541
Tel: 344 8100
Skype: aderiver


Joaquin Windmüller

unread,
Apr 15, 2009, 1:01:28 PM4/15/09
to cakep...@googlegroups.com
Paginator::sort genera links al mismo url con un parametro (named) adicional sort:nombre_campo

por ejemplo s estas en el listado de usuarios

http://ejemplo.com/usuarios/index

y haces clic en ordenar por nombre el url sera

http://ejemplo.com/usuarios/index/sort:nombre

Siguiendo esta idea, debes crear los urls (con HtmlHelper::link) que agreguen el named param con el campo por el que va a ordenar, y luego en el controlador:

$busqueda = $this->Client->find('all', array('order' => $this->params['named']['sord'] . ' ASC'));

Lo mismo sucede para determinar la direccion (ASC y DESC). Simplemente agrega otro named param que se intercambie al hacer clic en cada enlace.

2009/4/15 Adrian Rivera <ader...@gmail.com>

hormigaz

unread,
Apr 16, 2009, 4:37:17 AM4/16/09
to CakePHP en Español
Hola !
Gracias a los dos por vuestras respuestas.

Adrian, quería también aprender a ordenar las tablas con Ajax. Pero
aún así, quiero saber cómo hacerlo con el CakePHP.

Joaquin, he intentado entender lo que me has puesto en tu respuesta,
pero dado que llevo nada más que una semana con CakePHP me cuesta un
poco.
Por lo que me dices, he de crear un link (<?php echo $html->link
('Texto del link', '/clients/index/sort:name/direction:asc'); ?>) en
la vista index.ctp.
Ahora en el controlador, he de poner $busqueda = $this->Client->find
('all', array('order' => $this->params['named']['sord'] . ' ASC'));

Ok, esto me va cuando hago click en la cabecera de la tabla para
ordenar. Pero cuando entro la primera vez en la sección clientes, no
me va.
Cómo podría hacer que en la función index del controlador, siempre que
se cargara la sección clientes me saliera siempre ordenado por
nombre ??
Y no he sido capaz de hacer lo de agregar otro named param para poner
la tabla en orden inverso (DESC). Cómo lo podría hacer ?

Gracias de nuevo !

Joaquin Windmüller

unread,
Apr 16, 2009, 9:25:13 AM4/16/09
to cakep...@googlegroups.com
$sort = 'id';
if (isset($this->params['named']['sort'])) {
$sort = $this->params['named']['sort'];
}
$this->Client->find('all', array('order' => $sort . ' ASC'));

De ese modo $sort siempre sera algo.

2009/4/16 hormigaz <oscar.garr...@gmail.com>
Reply all
Reply to author
Forward
0 new messages