繁体   English   中英

是否可以在CakePHP的同一视图中对两个不同的模型进行分页和排序?

[英]Is it possible to page and sort two different models in the same view in CakePHP?

我想做一些非常直接和简单的事情。 我想在同一页面上有两组不同的分页数据。 两个不同的集合取决于不同的模型。 为了讨论,我们会说它们是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的分页器不支持的东西?

您需要覆盖该页面的Controller模型的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的参数,因此您可以传递特定于模型的数据,控制标志等。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM