CakePHP - Paginating数组

时间:2010-05-13 17:08:11

标签: cakephp

Cake使用简单的$ this-> paginate()来处理模型的分页,但是如果我想对一组值进行分页,我应该使用什么?

情景是这样的:

$this->set('sitepages', $this->paginate());

我的index()中的代码返回一个类似

的数组
Array
(
    [0] => Array
        (
            [Sitepage] => Array
                (
                    [id] => 13
                    [name] => Home
                    [urlslug] => home
                    [parent_id] => 1
                    [page_title] => Welcome to KIAMS, Pune
                    [order] => 1
                )   
        )
    [1] => Array
        (
            [Sitepage] => Array
                (
                    [id] => 26
                    [name] => About Us
                    [urlslug] => aboutus
                    [parent_id] => 1
                    [page_title] => 
                    [order] => 2
                )
        )
    [2] => Array
        (
            [Sitepage] => Array
                (
                    [id] => 27
                    [name] => Overview of KIAMS
                    [urlslug] => aboutus/overview
                    [parent_id] => 26
                    [page_title] => 
                    [order] => 2
                )
        )

我使用$ this-> Sitepage-> find('all')检索相同的数据,然后根据需要执行一些操作并形成一个与上面的数组非常相似的数组,但排序会发生变化。我想分页这个新数组并将其传递给视图。我试过了

$this->set('sitepages',$this->paginate($newarray))

但数据没有得到分页。有人可以帮忙在CakePHP中对$ newarray进行分页吗?

6 个答案:

答案 0 :(得分:2)

要在CakePHP中进行分页,您需要将选择条件传递给paginate()调用。

其他数据操作应该在模型文件中的afterFind()中完成。

如果您不需要在每次检索中完成这些更改,您可以考虑创建一个指向与当前表完全相同的表的新模型文件,并为该新表添加afterFind()方法文件。

答案 1 :(得分:1)

我正在使用cakephp版本1.3,看起来这个正在运行:

在控制器:

$result = $this->Paginate('Event');
$results = $this->Task->humanizeEvent($result);

$this->set('events', $results);

它似乎在视图中显示为普通的分页数组(在正常情况下在视图中设置您的分页)。

humanizeEvent函数只是编辑结果数组中的一个字段,使其成为基于数组内其他字段的句子,并且它似乎正常工作。

答案 2 :(得分:1)

我刚刚处理过同样的问题......

我发现唯一的方法是使用paginate()函数来处理所有逻辑,而不是传递一个自定义数组。但是,这并不像看起来那么糟糕:

$this->paginate = array(
    'limit' => 2,
    'order' => array(
        'Report.name' => 'asc'
    ),
    'conditions' => array(
        'Account.id' => $this->foo()
    ),
);
$reports = $this->paginate();

在此示例中,我正在对报告进行分页 - 但某些报告不会包含在内,具体取决于它们所属的帐户(帐户与报告,hasmany等有一些关系)。

通过在您的操作中编写$paginate,您可以对conditions数组使用自定义回调。因此,函数foo()可以写在控制器中(或推送到模型中)并返回一组有效的帐户ID。

我发现我可以轻松地在这个函数中重写我的自定义逻辑 - 保持我和Cake分页符的快乐。

希望有所帮助!

答案 3 :(得分:0)

$this->paginate($newarray)是错误的分页方式。第一个参数不能是数组。它必须是a model name。您可能希望从手册中学习pagination setup。这将按字母顺序排列:

var $paginate = array(
    'limit' => 25,
    'order' => array(
        'Sitepage.name' => 'asc'
    )
);
$this->set('sitepages', $this->paginate('Sitepage'));

答案 4 :(得分:0)

我创建了一个检查paginator代码的组件..

不是最好的,但它对我有用.....

控制器

$slicedArray = array_slice($fullArray,($page - 1) * $this->PaginatorArray->limit ,$this->PaginatorArray->limit)
$this->params['paging'] = $this->PaginatorArray->getParamsPaging('MyModel', $page,    $total,count($slicedArray));
$this->helpers[] = 'Paginator';

组件

<?php
/* SVN FILE: $Id$ */
/**
 * Pagination Array Component class file.
 * @subpackage    cake.cake.libs.view.helpers
 */
class PaginatorArrayComponent {

    var $limit = 40;
    var $step = 1;

    function startup( & $controller){
        $this->controller = & $controller;
    }

    function getParamsPaging($model, $page, $total, $current){
        $pageCount = ceil($total / $this->limit);
        $prevPage = '';
        $nextPage = '';

        if($page > 1)
            $prevPage = $page - 1;

        if($page + 1 <= $pageCount)
            $nextPage = $page + 1;

        return array(
            $model => array(
                'page' => $page,
                'current' => $current,
                'count' => $total,
                'prevPage' => $prevPage,
                'nextPage' => $nextPage,
                'pageCount' => $pageCount,
                'defaults' => array(
                    'limit' =>  $this->limit,
                    'step' => $this->step,
                    'order' => array(),
                    'conditions' => array(),

                ),
                'options' => array(
                    'page' => $page,
                    'limit' =>  $this->limit,
                    'order' => array(),
                    'conditions' => array(),

                )
            )
        );
    }

}
?>

答案 5 :(得分:0)

find(“count”)中存在一个错误,如果查询仅在组中生成记录,则返回错误计数。这已修复 click here