/**
* 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;
}
5条答案
按热度按时间ozxc1zmp1#
根据手册,您必须捕获异常并重定向到正确的页面
vxf3dgd42#
这是我所做的,尽管我不一定对此感到高兴。
正如您所看到的,我减少了查询字符串中的页码,并继续重定向,直到到达一个有效的页面。我无法找到已知的页数来直接定向到最后一页。而且,我不喜欢提取URL的部分来重建它。在我的例子中,$pass参数可能存在,也可能不存在,这就是为什么我进行空检查。虽然这样做有效,我很欢迎大家提出如何做得更好的建议。
pieyvz9o3#
我所做的是在捕获NoFoundException时获取上一页,但通过指定的参数:
不过,我认为最好只是覆盖分页器组件。
kninwzqo4#
这是可行的:
php类扩展了核心分页器组件{
} ```
只要把它放在你的项目中,它会自动被使用,而不是核心的。适用于〈= 3. 4(第一页)和3. 5+(最后一页)。
hgtggwj05#
使用try-catch进行分页并重定向到初始页。
要重定向到最后一页,请参阅@Kris的回答。