如何让cakephp分页器转到最后一页,当用户输入的页码大于最大页数(溢出)?

ukdjmx9f  于 2022-11-11  发布在  PHP
关注(0)|答案(5)|浏览(134)

假设我有21张唱片
我的视图显示每页10条记录
现在我在第3页,然后我删除了一条记录并刷新了页面
蛋糕将显示未找到错误
如何转到第2页(最后一页),而不是显示错误消息?
我检查了PaginatorComponent.php,它只是抛出了一个NotFoundException

if ($requestedPage > $page) {
            throw new NotFoundException();
        }
ozxc1zmp

ozxc1zmp1#

根据手册,您必须捕获异常并重定向到正确的页面

vxf3dgd4

vxf3dgd42#

这是我所做的,尽管我不一定对此感到高兴。

try {
        $this->Paginator->settings = $this->paginate;
        $widgets = $this->paginate();
    } catch (NotFoundException $e) {
        //Redirect to previous page
        $query = $this->request->query;
        $query['page']--;
        extract(Router::parse($this->request->here)); 
        $pass = empty($pass) ? '' : $pass[0]; 
        $this->redirect(array_merge(array('action' => $action, $pass), array('?' => $query))); 
    }

正如您所看到的,我减少了查询字符串中的页码,并继续重定向,直到到达一个有效的页面。我无法找到已知的页数来直接定向到最后一页。而且,我不喜欢提取URL的部分来重建它。在我的例子中,$pass参数可能存在,也可能不存在,这就是为什么我进行空检查。虽然这样做有效,我很欢迎大家提出如何做得更好的建议。

pieyvz9o

pieyvz9o3#

我所做的是在捕获NoFoundException时获取上一页,但通过指定的参数:

try {
    $records = $this->Paginator->paginate();
} catch (NotFoundException $e) {
    $this->request->params['named']['page']--;
    $records = $this->Paginator->paginate();
}

不过,我认为最好只是覆盖分页器组件。

kninwzqo

kninwzqo4#

这是可行的:
php类扩展了核心分页器组件{

/**
 * Overwrite to always redirect from out of bounds to last page of paginated collection.
 * If pageCount not available, then use first page.
 *
 * @param \Cake\Datasource\RepositoryInterface|\Cake\Datasource\QueryInterface $object The table or query to paginate.
 * @param array $settings The settings/configuration used for pagination.
 *
 * @throws \Cake\Network\Exception\NotFoundException
 *
 * @return \Cake\Datasource\ResultSetInterface Query results
 */
public function paginate($object, array $settings = [])
{
    try {
        $resultSet = parent::paginate($object, $settings);
    } catch (NotFoundException $exception) {
        $query = null;
        if ($object instanceof QueryInterface) {
            $query = $object;
            $object = $query->repository();
        }
        $alias = $object->alias();
        $lastPage = $this->request->params['paging'][$alias]['pageCount'] > 1 ? $this->request->params['paging'][$alias]['pageCount'] : null;

        $response = $this->getController()->redirect(['?' => ['page' => $lastPage] + $this->request->getQuery()]);

        // To be please PHPCS and tests, cannot be reached in production.
        if (PHP_SAPI === 'cli') {
            throw new NotFoundException('Redirect to ' . $response->getHeaderLine('Location') . ' for non-CLI.');
        } else {
            $response->send();
        }

        exit();
    }

    return $resultSet;
}

} ```
只要把它放在你的项目中,它会自动被使用,而不是核心的。适用于〈= 3. 4(第一页)和3. 5+(最后一页)。

hgtggwj0

hgtggwj05#

使用try-catch进行分页并重定向到初始页。

try {
      $videos = $this->paginate($videos, $paginate);
    } catch (NotFoundException $e) { // Not existing page
      return $this->redirect([ // Remove pagination
        "controller" => $this->request->getParam('controller'),
        "action" => $this->request->getParam('action'),
      ]);
    }

要重定向到最后一页,请参阅@Kris的回答。

相关问题