requestAction中的分页

时间:2013-09-09 16:24:21

标签: cakephp pagination cakephp-2.4

我正在构建一个动态视图(Page),该视图由通过$this->element('messages_unread')调用的多个元素(小部件)组成。其中一些元素需要与页面模型相关的数据 在现实生活中的话:我的用户将能够通过从众多元素中选择构建自己的页面(“前5个帖子”,“10个未读消息”等等)

我通过从元素中调用$this->requestAction(array('controller'=>'events','action'=>'archive')来获取数据,每个元素的url变量都不同。

我知道requestAction()价格昂贵,我打算通过适当的缓存来限制成本。

实际问题:
我的问题是分页。当我在Page视图中并调用requestAction('/events/archive')时,页面视图中的PaginatorHelper将不知道Event模型及其分页器变量和$this->Paginator->next()等...不会工作。
我怎样才能实现正确的分页?我试图通过调用$this->Paginator->options(array('model'=>'Event'))来设置模型,但这不起作用 我是否需要在requestAction中返回自定义的分页变量,从而构建我自己的?

还是有另一种方法甚至可以避免requestAction()吗?请记住,请求的数据与Page无关。

亲切的问候, 巴特

[编辑]我的临时解决方案,但仍然可以发表评论/解决方案:
在requestedAction Event/archive中,返回paginator变量以及如下数据: return array('data'=>$this->paginate(), 'paging' => $this->params['paging']);

1 个答案:

答案 0 :(得分:1)

我已经修改了一下,以下内容适用于我,而PaginationHelper也适用:

在元素中:

// requestAction returns an array('data'=>... , 'paging'=>...)
$data = $this->requestAction(array('controller'=>'events','action'=>'archive'));  

// if the 'paging' variable is populated, merge it with the already present paging variable in $this->params. This will make sure the PaginatorHelper works
if(!isset($this->params['paging'])) $this->params['paging'] = array();
$this->params['paging'] = array_merge( $this->params['paging'] , $data['paging'] );

foreach($data['events'] as $event) {
    // loop through data...
}

在控制器中:

public function archive() {
    $this->paginate = array(
        'limit'     => 10
    );

    if ($this->params['requested'])
        return array('events'=>$this->paginate('Event'), 'paging' => $this->params['paging']);

    $this->set('events', $this->paginate('Event') );
}