change CakePhp1.3 paginator destination url?

◇◆丶佛笑我妖孽 提交于 2019-12-25 16:54:14

问题


I'm new to cakephp...and I have a page with a url this:

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

so the controller is ´books´, the action is ´filteredByAuthor´ and ´John-Doe´ is a parameter.. but the url looks ugly so i've added a Route like this:

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

and now my link is:

http://localhost/author/John-Doe

the problem is that the view has a paginator and when i change the page (by clicking on the next or prev button).. the paginator won't consider my routing... and will change the url to this

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

the code on my view is just:

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

the documentation doesn't say anything about avoiding this and i've spent hours reading the paginators source code and api.. and in the end i just want my links to be something like this: (with the sort and direction included on the url)

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

Is it possible to do that and how?


回答1:


hate to answer my own question... but this might save some time to another developper =) (is all about getting good karma)

i found out that you can pass an "options" array to the paginator, and inside that array you can specify the url (an array of: controller, action and parameters) that the paginator will use to create the links.. so you have to write all the possible routes in the routes.php file. Basically there are 3 possibilities:

  • when the "page" is not defined

For example:

http://localhost/author/John-Doe

the paginator will assume that the it's the first page. The corresponding route would be:

Router::connect('/author/:name', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name'),'name'=>'[a-zA-Z\-]+'));
  • when the "page" is defined

For example:

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

The route would be:

Router::connect('/author/:name/:page', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name','page'),'name'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));
  • finally when the page and the sort is defined on the url (by clicking on the sort links created by the paginator).

For example:

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

The route is:

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]+',
            ));

on the view you have to unset the url created by the paginator, cause you'll specify your own url array on the controller:

Controller:

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;
}

Send the variable $options_url to the view using set()... so in the view you'll need to do this:

View:

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'));

Now, on the sort links you'll need to unset the variables 'sort' and 'direction'. We already used them to create the links on the paginator, but if we dont delete them, then the sort() function will use them... and we wont be able to sort =)

$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)); 

hope this helps =)



来源:https://stackoverflow.com/questions/4225632/change-cakephp1-3-paginator-destination-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!