2

我正在使用 cakephp 2.3.1,但 Paginator 组件有问题。

我的目标是这样的页面:

example.com/abruzzo
example.com/abruzzo/2
example.com/abruzzo/3

我创建了以下路线:

Router::connect('/:regione/:page', array('controller'=>'regions','action'=>'home'), array('page' =>'[0-9]+'));
Router::connect('/:regione', array('controller' => 'regions', 'action' => 'home'));  

(如您所见,第一条路线工作处理页面参数)

现在,为了正确处理页面参数,我在 RegionsController 的beforeFilter中添加了以下行。

public function beforeFilter()
{        
    $this->request->params['named']['page'] = (isset($this->request->params['page'])) ? $this->request->params['page'] : 1;
}

因为我阅读了 Paginator 组件会直接查看广告 ['named']['page'] 而不是 ['page'] 。

第一个问题:

它是否正确?我真的需要 beforeFilter() 中的这个技巧吗?


然后,我需要使用以下方法显示页面编号:

<?php echo $this->Paginator->numbers(); ?>

这里的问题是在链接上创建的 URL 是错误的。他们指向:

example.com/regions/home/page:2
example.com/regions/home/page:3
etc...

不需要这样的 URL,我需要:

example.com/abruzzo
example.com/abruzzo/2
example.com/abruzzo/3

第二个问题:

如何强制使用我想要的 url 而不是 controller/action/page:N 格式?

谢谢!

4

2 回答 2

1

这可能是重复的。

但是,回答你的第一个问题:这取决于。如果您确定您的 url 不会接收更多参数,那么您的路由可能更像

Router::connect('/:regione/*', array('controller'=>'regions','action'=>'home'));

并在“家”动作中做

public function home($pageOption=null) {
    if (is_numeric($option)) {
        $this->passedArgs['page'] = $pageOption;
    }
    $items = $this->paginate('Home');
    ...
}

我认为 beforeFilter 选项更好,因为它是可重用的,并且可以让您更好地组织参数。

现在,帮助其他类似问题(以及您的第二个问题)的文章恢复到此

在 home.ctp 视图中(或任何你喜欢的)

$prev_link = str_replace('page:', '', $this->Paginator->prev('« Prev'));
$prev_link = preg_replace('/\/1"/', '"', $prev_link);
$next_link = str_replace('page:', '', $this->Paginatornext('Next »'));
echo $prev_link;
echo $next_link;

所以,而不是通常的

echo $this->Paginator->prev('< Prev');
echo $this->Paginator->numbers();
echo $this->Paginator->next('Next >');

您必须手动替换 url 的“page:”部分,然后回显它。

当然,您可以随时修改 PaginationHelper,但我不建议这样做,因为每次更新蛋糕时,您都必须检查 PaginationHelper 是否已更改,然后重新调整它。

如果您不清楚某些事情,请阅读有关其他问题的文章希望它有所帮助。

于 2013-04-05T18:18:01.453 回答
0

我想这就是你要找的

https://github.com/hashmode/Cakephp-Beauty-Paginator

于 2013-11-24T13:12:09.213 回答