我正在构建一个动态视图 (
Page
),它由通过 $this->element('messages_unread')
调用的多个元素(小部件)组成。其中一些元素需要与页面模型不相关的数据。我通过从元素内调用
$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()
?请记住,请求的数据与页面无关。
亲切的问候, 巴特
[编辑]我的临时解决方案,但仍开放征求意见/解决方案:
在 requestAction
Event/archive
中,返回分页器变量以及数据,如下所示:
return array('data'=>$this->paginate(), 'paging' => $this->params['paging']);
我做了更多修改,以下内容对我有用,并且 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') );
}