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> </span>'', ''title'',array(''escape''=>false,''url''=>$options_sort));
Espero que esto ayude =)