代码之家  ›  专栏  ›  技术社区  ›  Daniel Bingham

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

  •  4
  • Daniel Bingham  · 技术社区  · 14 年前

    我想做一些非常直接和简单的事情。我想在同一页上有两组不同的分页数据。这两个不同的集合取决于不同的模型。为了讨论,我们会说他们是 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 . 结果是一个错误,因为 项目 无法按排序 图像。创建 . 我做错什么了吗?或者这是CakePHP的分页器不支持的吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Abba Bryant    14 年前

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

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

        2
  •  2
  •   Leo    14 年前

    您需要重写该页的控制器模型的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;
    }
    

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