我想做一些非常直接和简单的事情。我想在同一页面上有两组不同的分页数据。两个不同的集合取决于不同的模型。为了讨论,我们会说它们是Image
和Item
。
我可以为两个模型设置两个寻呼机,并获得正确的对象集。我可以获得正确的寻呼机链接。但是当涉及到实际跟随参数的链接时,两个寻呼机都会读取参数并假设它们适用于它们。
看起来像这样:
$this->paginate = array (
'Item'=>array(
'conditions'=>array('user_id'=>$id),
'limit' => 6,
'order' => array(
'Item.votes'=>'desc',
'Item.created'=>'desc'
),
'contain'=>array(
'User',
'ItemImage' => array (
'order'=>'ItemImage__imageVotes desc'
)
)
),
'Image'=>array(
'limit'=>6,
'contain'=>array(
'User',
'ItemImage'=>array('Item'),
),
'order'=>array(
'Image.votes'=>'desc',
'Image.views'=>'desc'
),
'conditions'=>array(
'Image.isItemImage'=>1,
'Image.user_id'=>$id
)
)
);
$this->set('items', $this->paginate('Item'));
$this->set('images', $this->paginate('Image'));
那是在控制器中。在视图中,我的排序链接看起来像这样:
<div class="control"><?php echo $this->Paginator->sort('Newest', 'Image.created', array('model'=>'Image')); ?></div>
然而,这产生了一个如下所示的链接:
http://localhost/profile/37/page:1/sort:Image.created/direction:asc
没有什么可以告诉分页器我打算排序的模型。因此,当我点击链接时,它会尝试按Image.created
对两个模型进行排序。结果是错误,因为Item
无法按Image.created
排序。有什么我做错了吗?或者这是CakePHP的分页器不支持的东西吗?
答案 0 :(得分:2)
您需要覆盖该页面控制器模型的paginate方法。
我做了类似的事情,也许这段代码会有所帮助:
function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
$pageParams = compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group');
$this->contain('ModuleType', 'NodeDescriptor');
$pageItems = $this->find('all',$pageParams);
$pagesOut = array();
foreach($pageItems as $pageItem)
{
$status = $pageItem['SiteAdmin']['status_id'];
$moduleInfo = null;
$nodeTitle = $pageItem['NodeDescriptor']['title'];
$published = $pageItem['NodeDescriptor']['published'];
$pageitemID = $pageItem['SiteAdmin']['id'];
$moduleId = $pageItem['SiteAdmin']['module_id'];
$contName = $pageItem['ModuleType']['controller'];
if($moduleId)
{
$thisModel = ClassRegistry::getObject($moduleType);
$thisModel->contain();
$moduleInfo = $thisModel->read(null,$moduleId);
$moduleInfo = $moduleInfo[$moduleType];
}
$pagesOut[] = array(
'status'=>$status,
'node'=>$nodeTitle,
'published'=>$published,
'info'=>$moduleInfo,
'module_id'=>$moduleId,
'contName'=>$contName,
'pageitem_id'=>$pageitemID);
}
return $pagesOut;
}
通过这种方式,您可以控制传递给paginate的参数,因此您可以传递特定于模型的数据,控制标志等。
答案 1 :(得分:1)
最简单的解决方案是将两个网格实现为获取自己数据的元素,并使用AJAX将元素加载到页面中。
唯一的另一个选择是修改参数,以便在排序或单步执行页面时将两个网格的参数传递给每个网格。上面Leo发布的代码是一个好的开始。您可以将模板键从paginate数组添加到每个命名的param上,并确保将所有url参数传递给paginate函数,并且应该朝正确的方向前进。