CakePHP - разбиение на страницы в массиве - PullRequest
1 голос
/ 13 мая 2010

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))

Но данные не разбиваются на страницы.Кто-нибудь может помочь с разбиением на страницы $ newarray в CakePHP?

Ответы [ 6 ]

2 голосов
/ 13 мая 2010

Для разбивки на страницы в CakePHP вам нужно передать выбранные условия в вызов paginate ().

Другие манипуляции с данными должны выполняться в afterFind () в файле модели.

Если вам не нужно вносить эти изменения при каждом отдельном извлечении, вы можете также рассмотреть возможность создания нового файла модели, указывающего на ту же таблицу, что и текущая, и добавления метода afterFind () к этому новому файл.

1 голос
/ 03 июня 2012

Я только что имел дело с этой же проблемой ...

Я обнаружил, что единственный способ - использовать функцию paginate() для обработки всей логики, а не передавать ее в пользовательский массив. Однако это не так плохо, как кажется:

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

В этом примере я разбиваю на страницы отчеты - но некоторые отчеты не будут включены, в зависимости от того, к какой учетной записи они принадлежат (учетная запись имеет определенные отношения с отчетом, hasmany и т. Д.).

Написав $paginate внутри своего действия, вы можете использовать собственный обратный вызов для массива условий. Таким образом, функция foo() может быть записана в вашем контроллере (или отправлена ​​в модель) и возвращает массив действительных идентификаторов учетной записи.

Я обнаружил, что могу легко переписать свою пользовательскую логику в этой функции, чтобы и я, и пагинатор Cake были довольны.

Надеюсь, это поможет!

1 голос
/ 28 ноября 2011

Я использую CakePHP версии 1.3, и кажется, что этот работает:

на контроллере:

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

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

и кажется, что он отображается в виде обычного разбитого на страницы массива на виде (настройте разбиение на страницы в обычном режиме).

Функция humanizeEvent просто редактирует поле в массиве результатов, чтобы сделать его предложением, основанным на других полях в массиве, и, похоже, работает правильно.

0 голосов
/ 20 декабря 2012

Произошла ошибка в find ("count"), и он вернул неверное количество, если запрос привел к записи только для группы. Это было исправлено нажмите здесь

0 голосов
/ 20 ноября 2010

Я создаю компонент, проверяющий код страницы.

Это не самая лучшая вещь, но она работает для меня .....

Контроллер

$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(),

                )
            )
        );
    }

}
?>
0 голосов
/ 14 мая 2010

$this->paginate($newarray) - неправильный способ разбиения на страницы. Первый параметр не может быть массивом. Это должно быть название модели . Вы можете изучить настройки нумерации страниц из руководства. Это будет порядок в алфавитном порядке:

var $paginate = array(
    'limit' => 25,
    'order' => array(
        'Sitepage.name' => 'asc'
    )
);
$this->set('sitepages', $this->paginate('Sitepage'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...