4

我想做一些非常直接和简单的事情。我想在同一页面上有两组不同的分页数据。这两个不同的集合取决于不同的模型。为了讨论起见,我们会说它们是ImageItem

我可以为两个模型设置两个寻呼机,并获得正确的对象集。我可以获得正确的寻呼机链接。但是当涉及到实际跟踪参数的链接时,两个寻呼机都会读取参数并假设它们适用于它们。

它最终看起来像这样:

   $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 的分页器不支持的东西?

4

2 回答 2

2

您需要覆盖该页面的控制器模型的分页方法。

我做了类似的事情,也许这个片段会有所帮助:

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

通过这样做,您可以控制传递给分页的参数,因此您可以传递特定于模型的数据、控制标志等。

于 2010-11-17T09:06:35.350 回答
1

最简单的解决方案是将两个网格实现为获取它们自己的数据并使用 AJAX 将元素加载到页面中的元素。

唯一的其他选择是修改参数,以便在排序或单步浏览页面时将两个网格的参数传递给每个网格。上面 Leo 发布的代码是一个好的开始。您可以将分页数组中的模型键添加到每个命名参数上,并确保将所有 url 参数传递给分页函数,并且您应该朝着正确的方向前进。

于 2010-11-18T16:09:42.290 回答