1

我在 Cakephp 2.0 中的分页器上苦苦挣扎。当我尝试将我的应用程序迁移到 2.0 时,我找不到任何直接跳转到最后一页的解决方案。在 1.3 中,像这样从外部执行此操作很安静:

echo $this->Html->link(__('Flights'), array('controller' => 'flights',
    'action' => 'index','page' => 'last'));

但是这个在 2.0 中放入 'page:last' 的小技巧不再起作用了。当然有一个名为 last 的 Paginator 函数,但这只有在我已经在应用程序中时才有帮助。我的问题是从外部链接直接访问分页器的最后一页。

4

3 回答 3

0

如果“last”作为页码传递,您可以自己“计算”最后一页;

不鼓励在 CakePHP 库文件中进行修改,因为这会使将来难以执行升级。

基本上,PaginatorHelper 使用由 PaginatorComponent 计算和设置的 viewVars,如下所示:https ://github.com/cakephp/cakephp/blob/master/lib/Cake/Controller/Component/PaginatorComponent.php#L212

你可以在你的行动中复制它;例如:

public function index()
{
    if (!empty($this->request->params['named']['page'])) {
        switch($this->request->params['named']['page']) {
           case 'first':
                // replace the 'last' with actual number of the first page
                $this->request->params['named']['page'] = 1;
                break;

           case 'last':
                // calculate the last page
                $limit = 10; // your limit here
                $count = $this->Flight->find('count');
                $pageCount = intval(ceil($count / $limit));

                // replace the 'last' with actual number of the last page
                $this->request->params['named']['page'] = $pageCount;
                break;
        }

    }

    // then, paginate as usual
    $this->set('data', $this->paginate('Flight'));
}

为了改进这一点,应该将此逻辑移至单独的方法或行为。然而; 如上所示,不需要在 PaginatorComponent 中进行修改!

另请注意,我的示例中的“查找(计数)”不采用附加条件,如果需要,应添加它们

如果您查看 CakePHP 1.3 的源paginate()代码,上面的代码是可比较的;https://github.com/cakephp/cakephp/blob/1.3/cake/libs/controller/controller.php#L1204

于 2013-03-15T22:12:10.690 回答
0

在为这个问题创建赏金后不久,我使用 CakePHP 2.2.4 找到了我的问题的解决方案。我试图完成相同的任务,但使用 2.2.4 版本而不是 2.0。基本上,如果我有一个看起来像http://www.domain.com/articles/page:last的链接,控制器的分页方法将知道要转到哪个页面并显示该页面的正确结果(文章)。例如,如果我有 110 篇文章并且分页限制设置为 25,通过转到该 URL,它将显示第 5 页,共 5 页,显示记录 101-110。如果我转到“page:first”,我也想要同样的能力。

我需要更改我的库文件lib/Cake/Controller/Component/PaginatorComponent.php

我变了

if (intval($page) < 1) {
    $page = 1;
}

if ((intval($page) < 1 && $page != "last") || $page == "first") {
    $page = 1;
}

我还添加了

if($page == "last"){
    $page = $pageCount;
}

线后

$pageCount = intval(ceil($count / $limit));

Christian Waschke,使用此解决方案,您可以使用与您在问题中所写完全相同的链接助手。对我来说,链接助手看起来像这样

<?php echo $this->Html->link('Go to Last Page', array('controller' => 'articles', 'action' => 'index', 'page' => 'last')); ?>
于 2013-03-13T16:17:29.727 回答
0

这是简单的方法:

echo  $this->Paginator->last('Any text');

获取最后一页编号的其他方法是:

echo  $this->Paginator->counter(array('format' => '{:pages}'));

然后您可以使用它来生成您的链接。

欲了解更多信息: http ://book.cakephp.org/2.0/en/core-libraries/helpers/paginator.html#PaginatorHelper::last

于 2012-11-22T16:58:26.850 回答