2010-05-13 2 views
1

Торт обрабатывает разбиение на страницы модели с помощью простого $ this-> paginate(), но что я должен использовать, если хочу разбивать массив значений?CakePHP - разбиение на страницы массива

Сценарий таков:

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

Этот код в моем индексе() возвращает массив, как

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-> найти ('all'), а затем выполнил некоторые манипуляции по мере необходимости и сформировал массив, который очень похож на предыдущий, но порядок изменяется. Я хочу разбить этот новый массив и передать его в представление. Я попробовал

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

Но данные не становятся разбитыми на страницы. Может кто-нибудь, пожалуйста, помогите с разбиением на страницы $ newarray в CakePHP?

ответ

2

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

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

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

+0

Создание модели на мой взгляд было бы излишним. Конечно, должен быть какой-то простой способ разбиения на страницы массива данных ... – Ashok

+0

Помогает ли PaginatorHelper в любом случае? Похоже, вы можете использовать его для разбивки данных из представления. Он может делать то, что вам нужно. http://book.cakephp.org/view/166/Pagination-in-Views –

+1

@Ashok Когда вы используете фреймворк, который должен быть легким в других, необязательно в этом. Они дают вам некоторые отличные функции, но когда вам нужна дополнительная настройка, вы, вероятно, попадете в специальные решения во всех возможных рамках, а не только в CakePHP. – Seb

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')); 
+0

Вы не поняли вопроса ... проблема не в разбивке на страницы, а с некоторыми уточненными результатами, которые он хочет разбивать на страницы. – Seb

+0

Seb сказал это .... – Ashok

+0

Вы нашли решение? У меня такая же проблема, я передаю массив условий Model-> find ('all'), и результаты будут такими, какие я ожидаю. Тем не менее, я не могу разбиться на страницы с условиями. Grrrr – Bear

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

       ) 
      ) 
     ); 
    } 

} 
?> 
1

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

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

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

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

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

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

1

Я только что занимался этим же проблемой ...

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

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

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

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

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

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

0

Ошибка поиска («count»), и она вернула неверный счет, если запрос привел к записи только для группы. Это было исправлено click here

Смежные вопросы