php pagination routes friendly-url

cambiar la URL de destino del paginador CakePhp1.3?



pagination routes (1)

Soy nuevo en cakephp ... y tengo una página con una url esto:

http://localhost/books/filteredByAuthor/John-Doe

entonces el controlador es ''libros'', la acción es ''filtrada por autor'' y ''Juan-Doe'' es un parámetro ... pero la URL parece fea, así que he agregado una ruta como esta:

Router::connect(''/author/:name'', array( ''controller'' => ''books'',''action'' => ''filteredByAuthor''), array(''pass''=>array(''name''),''name''=>".*"));

y ahora mi enlace es:

http://localhost/author/John-Doe

el problema es que la vista tiene un paginador y cuando cambio la página (haciendo clic en el botón siguiente o anterior) ... el paginador no tendrá en cuenta mi enrutamiento ... y cambiará la URL a este

http://localhost/books/filteredByAuthor/John-Doe/page:2

el código en mi opinión es justo:

<?php echo $this->Paginator->prev(''<< '' . __(''previous'', true), array(), null, array(''class''=>''disabled''));?>

la documentación no dice nada sobre evitar esto y he pasado horas leyendo el código fuente y la API de los paginadores ... y al final solo quiero que mis enlaces sean algo como esto: (con el género y la dirección incluidos en la URL) )

http://localhost/author/John-Doe/1/name/asc

¿Es posible hacer eso y cómo?


Odio responder mi propia pregunta ... pero esto podría ahorrarle tiempo a otro desarrollador =) (se trata de obtener un buen karma)

descubrí que puedes pasar una matriz de "opciones" al paginador, y dentro de esa matriz puedes especificar la url (una matriz de: controlador, acción y parámetros) que el paginador usará para crear los enlaces ... para que tengas para escribir todas las rutas posibles en el archivo routes.php. Básicamente hay 3 posibilidades:

  • cuando la "página" no está definida

Por ejemplo:

http://localhost/author/John-Doe

el paginador asumirá que es la primera página. La ruta correspondiente sería:

Router::connect(''/author/:name'', array( ''controller'' => ''books'',''action'' => ''filteredByAuthor''),array(''pass''=>array(''name''),''name''=>''[a-zA-Z/-]+''));

  • cuando la "página" está definida

Por ejemplo:

http://localhost/author/John-Doe/3 (page 3)

La ruta sería:

Router::connect(''/author/:name/:page'', array( ''controller'' => ''books'',''action'' => ''filteredByAuthor''),array(''pass''=>array(''name'',''page''),''name''=>''[a-zA-Z/-]+'',''page''=>''[0-9]+''));

  • finalmente, cuando la página y el género se definen en la url (haciendo clic en los enlaces de clasificación creados por el paginador).

Por ejemplo:

http://localhost/author/John-Doe/3/title/desc (John Doe''s books ordered desc by title)

La ruta es:

Router::connect(''/author/:name/:page/:sort/:direction'', array( ''controller'' => ''books'',''action'' => ''filteredByAuthor''), array(''pass''=>array(''name'',''page'',''sort'',''direction''), ''name''=>"[a-zA-Z/-]+", ''page''=>''[0-9]*'', ''sort''=>''[a-zA-Z/.]+'', ''direction''=>''[a-z]+'', ));

en la vista debe deshacer la url creada por el paginador, porque especificará su propia matriz de url en el controlador:

Controlador:

function filteredByAuthor($name = null,$page = null , $sort = null , $direction = null){ $option_url = array(''controller''=>''books'',''action''=>''filteredByAuthor'',''name''=>$name); if($sort){ $this->passedArgs[''sort''] = $sort; $options_url[''sort''] = $sort; } if($direction){ $this->passedArgs[''direction''] = $direction; $options_url[''direction''] = $direction; }

Envíe la variable $options_url a la vista usando set () ... así que en la vista deberá hacer esto:

Ver:

unset($this->Paginator->options[''url'']); echo $this->Paginator->prev(__(''« Précédente'', true), array(''url''=>$options_url), null, array(''class''=>''disabled'')); echo $this->Paginator->numbers(array(''separator''=>'''',''url''=>$options_url)); echo $this->Paginator->next(__(''Suivante »'', true), array(''url''=>$options_url), null, array(''class'' => ''disabled''));

Ahora, en los enlaces de clasificación, tendrá que deshacer las variables ''ordenar'' y ''dirección''. Ya los usamos para crear los enlaces en el paginador, pero si no los eliminamos, la función sort () los usará ... y no podremos ordenar =)

$options_sort = $options_url; unset($options_sort[''direction'']); unset($options_sort[''sort'']); echo $this->Paginator->sort(''Produit <span>&nbsp;</span>'', ''title'',array(''escape''=>false,''url''=>$options_sort));

Espero que esto ayude =)