更改CakePhp 1.3分页目标网址?

时间:2010-11-19 13:55:17

标签: php pagination routes friendly-url

我是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

是否可以这样做以及如何做到?

1 个答案:

答案 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]+'));
  • 最后在网址上定义页面和排序时(通过单击分页器创建的sort链接)。

例如:

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>&nbsp;</span>', 'title',array('escape'=>false,'url'=>$options_sort)); 

希望这有助于=)