PaginationRecall组件给我带来了麻烦,让我的应用程序崩溃。
我有一个区域视图,我可以用/ views / [区域数]
来调用它我发现崩溃的原因是它想要回到Page:5 虽然网址被更改为只有1或2页的不同区域。 我更新到最新的cakePHP版本[v2.3.5],因为有一个关于修复'防止因超出最大整数值而导致的分页限制的修复程序'但更新并没有解决我的问题。不确定这是PaginationRecal组件还是Paginator本身的问题。
例如;我可以浏览到网址../regions/view/1/page:5离开那个页面,什么时候回来都很好[它记得最后一页] 但是当将网址更改为其他区域时../regions/view/56/会因错误而崩溃:错误:请求的地址' / regions / view / 56'在这服务器上没找到。 堆栈跟踪
CORE / Cake / Controller / Controller.php第1074行
起初我并不理解这次崩溃,直到我发现它与页码有关。仅在第一页上浏览时,问题永远不会弹出。我该如何解决这个问题?
我在/app/Controller/AppController.php中添加了PaginatorRecall组件
public $components = array('PaginationRecall');
这是组件:http://bakery.cakephp.org/articles/Zaphod/2012/03/27/paginationrecall_for_cakephp_2_x
任何帮助都非常感激。
答案 0 :(得分:0)
解决
在调查了PaginatorRecall组件正在做什么之后,我发现它只过滤了页面:number并将其存储在会话中。
我添加了一条规则来确定区域是否已更改,如果是,则将页面重置为页面:1
希望这也有助于其他人使用此组件。
答案 1 :(得分:0)
这是我对此问题的解决方案以及 PaginationRecall 与第一页的错误。当然,它不是最理想的解决方案,但它具有功能性。
class PaginationRecallComponent extends Component {
var $components = array('Session');
var $Controller = null;
function initialize(&$controller) {
$this->Controller = & $controller;
$options = array_merge($this->Controller->request->params, $this->Controller->params['url'], $this->Controller->passedArgs
);
$vars = array('page', 'sort', 'direction', 'filter');
$keys = array_keys($options);
$count = count($keys);
for ($i = 0; $i < $count; $i++) {
if (!in_array($keys[$i], $vars) || !is_string($keys[$i])) {
unset($options[$keys[$i]]);
}
}
//save the options into the session
if ($options) {
if ($this->Session->check("Pagination.{$this->Controller->modelClass}.options")) {
$options = array_merge($this->Session->read("Pagination.{$this->Controller->modelClass}.options"), $options);
}
$this->Session->write("Pagination.{$this->Controller->modelClass}.options", $options);
$this->Session->write("region",$this->Controller->modelClass.'/'.$this->Controller->view);
}
$region=$this->Session->read('region');
//recall previous options
if ($this->Session->check("Pagination.{$this->Controller->modelClass}.options") && $region==$this->Controller->modelClass.'/'.$this->Controller->view ) {
$options = $this->Session->read("Pagination.{$this->Controller->modelClass}.options");
if(!isset($this->Controller->params['named' ]['page']) && isset($this->Controller->params['named' ]['direction']) )
{
$options['page']=1;
}
$this->Controller->passedArgs = array_merge($this->Controller->passedArgs, $options);
$this->Controller->request->params['named'] = $options;
}
}
}