cakephp PaginationRecall组件使用不同的url / pages崩溃我的应用程序

时间:2013-05-21 18:54:11

标签: cakephp

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行

  • @deprecated改为使用PaginatorComponent * / public function paginate($ object = null,$ scope = array(),$ whitelist = array()){ return $ this-> Components-> load(' Paginator',$ this-> paginate) - > paginate($ object,$ scope,$ whitelist); }

起初我并不理解这次崩溃,直到我发现它与页码有关。仅在第一页上浏览时,问题永远不会弹出。我该如何解决这个问题?

我在/app/Controller/AppController.php中添加了PaginatorRecall组件

 public $components = array('PaginationRecall');

这是组件:http://bakery.cakephp.org/articles/Zaphod/2012/03/27/paginationrecall_for_cakephp_2_x

任何帮助都非常感激。

2 个答案:

答案 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;
        }
    }
}