gpt4 book ai didi

CakePHP 2 分页给出 404 地址未找到错误

转载 作者:行者123 更新时间:2023-12-05 00:29:56 27 4
gpt4 key购买 nike

我正在使用 CakePHP 2.3 开发应用程序,但遇到分页问题。当我点击任何分页链接时,我得到一个/cab/ServiceDirectory/refine/page:2(或任何一个链接)未在此服务器上找到。如果我去/cab/ServiceDirectory/refine 我看到分页链接显示应该有 5 页。如果我从 Controller 和 View 中删除分页代码,我会看到我应该看到的所有结果。

在我的 ServiceDirectoryResultsController 我有

public function index() {
$this->ServiceLocation->recursive=0;
}

public function refine ($id=null) (

// All my code to get the ServiceLocations from the DB

$this->paginate->array(
'conditions' => array('ServiceLocation.state' => $states[$state], 'ServiceLocation.solution_categories' => $active_cat),
'limit' => 8,
);

$results = $this->paginate('ServiceLocation');
$this->set('serviceLocation' ,$results);

}

在我看来,我有
<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
?>
</div>

<?php foreach ($serviceLocation as $Location): ?>

// I echo a few things from the $Location array

<?php endforeach; ?>

<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
?>
</div>

如果没有分页并使用查找所有内容并将其发送到 View ,我会看到我期望的 40 个结果。

随着分页,我会看到分页链接,如果我将鼠标悬停在它们上面,我会看到我的 url/cab/ServiceDirectoryResults/refine/page:2 或 page:3 或 page:4 或 page:5

如果我点击任何带有 :pageX 的链接,我会收到一个错误

错误:在此服务器上找不到请求的地址“/cab/ServiceDirectoryResults/refine/page:2”

我已经阅读了大量有关 CakePHP 分页的文章,但找不到任何导致这种行为的原因。任何人都可以提出原因或可能的解决方案或可遵循的路径来调试此错误吗?

问候

理查德

我检查了错误级别,它已经​​设置为级别 2

这是错误日志中的最后一个条目
2013-05-22 17:09:28 Error: [NotFoundException] Not Found
Request URL: /cab/ServiceDirectoryResults/refine/page:2
Stack Trace:
#0 /var/www/html/cab/lib/Cake/Controller/Controller.php(1074): PaginatorComponent->paginate('ServiceLocation', Array, Array)
#1 /var/www/html/cab/app/Controller/ServiceDirectoryResultsController.php(381): Controller->paginate('ServiceLocation')
#2 [internal function]: ServiceDirectoryResultsController->refine()
#3 /var/www/html/cab/lib/Cake/Controller/Controller.php(486): ReflectionMethod->invokeArgs(Object(ServiceDirectoryResultsController), Array)
#4 /var/www/html/cab/lib/Cake/Routing/Dispatcher.php(187): Controller->invokeAction(Object(CakeRequest))
#5 /var/www/html/cab/lib/Cake/Routing/Dispatcher.php(162): Dispatcher->_invoke(Object(ServiceDirectoryResultsController), Object(CakeRequest), Object(CakeResponse))
#6 /var/www/html/cab/app/webroot/index.php(109): Dispatcher- >dispatch(Object(CakeRequest), Object(CakeResponse))
#7 {main}

希望有帮助

最佳答案

仅供引用:我使用的是 Cakephp 2.4,我只在这个版本上测试过。

我遇到了同样的问题。我将分页变量存储在用户 session 中。
这样,当用户离开页面时,他们在返回页面时不会丢失他们的位置(页面/排序字段/方向)。

因为我将变量存储在 session 中,然后从 session 中检索它们,如果说用户单击导致结果小于他们所在页面的链接,我将得到 404。

示例(他们所在的页面):
http://localhost/products/index/page:5/sort:Product.name
我把这个链接发给他们:
http://localhost/products/index/search:[search_term]
这将结果过滤为仅 2 页。
在这种情况下,恢复 session 变量的实际(永久)链接将如下所示:
http://localhost/products/index/page:5/sort:Product.name/search:[search_term]
第 5 页超出了新结果的 2 页的范围。
这将抛出 NotFoundException();在这里看到:
http://api.cakephp.org/2.4/source-class-PaginatorComponent.html#238

我解决这个问题的方法是捕获异常,然后将它们重定向到第一页。
由于所有分页变量(包括“搜索”)都存储在 session 中,因此我只需要传递页面变量:

例子:
http://localhost/products/index/page:1
Cakephp 推荐这是一种可能的方法来克服它:
http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html#out-of-range-page-requests

但是,我希望它可用于我所有的“索引”页面,所以我覆盖了 Controller::paginate() AppController 中的方法.
此处看到的原始分页方法:
http://api.cakephp.org/2.4/source-class-Controller.html#1070-1081

这是我在我的 Controller/AppController.php 中的做法:

<?php

class CommonAppController extends Controller
{
// ..... other code
public function paginate($object = null, $scope = array(), $whitelist = array())
{
/*
* Used to see if we get an exception thrown,
* If so, send them to the first page, and set the flash so they know
*/
try
{
// taken from their current paginate();
// http://api.cakephp.org/2.4/source-class-Controller.html#1070-1081
return $this->Components->load('Paginator', $this->paginate)->paginate($object, $scope, $whitelist);
}
catch (NotFoundException $e)
{
//Do something here like redirecting to first or last page.
//$this->request->params['paging'] will give you required info.
$page = (isset($this->request->params['named']['page'])?$this->request->params['named']['page']:1);

$this->Session->setFlash(__('Unable to find results on page: %s. Redirected you to page 1.', $page));
return $this->redirect(array('page' => 1));
}
}
// ..... other code
}
?>

关于CakePHP 2 分页给出 404 地址未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16684674/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com