我是cakephp的新手...我有一个带有网址的页面:
http://localhost/books/filteredByAuthor/John-Doe
所以控制器是'books',动作是'filledByAuthor'而'John-Doe'是参数..但是网址看起来很难看,所以我添加了这样的路线:
Router::connect('/author/:name', array( 'controller' => 'books','action' => 'filteredByAuthor'), array('pass'=>array('name'),'name'=>".*"));
现在我的链接是:
http://localhost/author/John-Doe
问题是该视图有一个分页器,当我更改页面时(通过单击下一个或上一个按钮)..分页器将不会考虑我的路由...并将更改URL到此
http://localhost/books/filteredByAuthor/John-Doe/page:2
我视图中的代码只是:
<?php echo $this->Paginator->prev('<< ' . __('previous', true), array(), null, array('class'=>'disabled'));?>
文档没有说明要避免这种情况,我花了几个小时阅读paginators源代码和api ..最后我只想要我的链接是这样的:(包括排序和方向在网址上)
http://localhost/author/John-Doe/1/name/asc
是否可以这样做以及如何做到?
答案 0 :(得分:1)
讨厌回答我自己的问题......但是这可能会节省一些时间给另一个开发者=)(就是要获得好的业力)
我发现你可以将“options”数组传递给paginator,并且在该数组中你可以指定palator用来创建链接的url(控制器,动作和参数数组)。所以你必须在routes.php文件中写下所有可能的路由。基本上有3种可能性:
例如:
http://localhost/author/John-Doe
分页器将假设它是第一页。相应的路线是:
Router::connect('/author/:name', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name'),'name'=>'[a-zA-Z\-]+'));
例如:
http://localhost/author/John-Doe/3 (page 3)
路线是:
Router::connect('/author/:name/:page', array( 'controller' => 'books','action' => 'filteredByAuthor'),array('pass'=>array('name','page'),'name'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));
例如:
http://localhost/author/John-Doe/3/title/desc (John Doe's books ordered desc by title)
路线是:
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]+',
));
在视图上你必须取消设置由paginator创建的url,因为你将在控制器上指定你自己的url数组:
<强>控制器:强>
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;
}
使用set()将变量$options_url
发送到视图...因此在视图中您需要执行此操作:
查看:强>
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'));
现在,在排序链接上,您需要取消设置变量'sort'和'direction'。我们已经用它们来创建paginator上的链接,但如果我们不删除它们,那么sort()函数将使用它们......我们将无法排序=)
$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));
希望这有助于=)