PaginatorHelper не проверяет номер страницы

У меня проблема с помощником постраничного вывода Cakephp2.3. В версии 1.3 метод paginate проверял правильность значения переданного параметра страницы. Теперь он больше не работает.

Например, если у меня есть список с 30 результатами, по 10 элементов на странице, то это было перенаправление на последнюю (третью) страницу:

mycontroller/index/page:130

Теперь, когда я изменяю URL-адрес непосредственно в браузере и передаю недопустимый номер страницы, он просто говорит, что результатов нет.

Вот как я использую метод paginate:

$this->paginate = array(
                'limit' => 10,
                'order' => 'Appointment.start_datetime DESC'
            );
$appointments = $this->paginate('Appointment');

Есть что-то, что мне не хватает?

Заранее спасибо.

ОБНОВЛЕНИЕ

Помощник paginator знает, как правильно подсчитать количество страниц, но, похоже, ему все равно, передан ли правильный номер страницы. Вот вывод из представления:

print_r($this->Paginator->params());

показывает:

Array
(
    [page] => 1
    [current] => 10
    [count] => 30
    [prevPage] => 
    [nextPage] => 1
    [pageCount] => 3
    [order] => Appointment.start_datetime DESC
    [limit] => 10
    [options] => Array
        (
            [page] => 1
        )

    [paramType] => named
)

person alex.ac    schedule 30.11.2012    source источник


Ответы (2)


Кажется, что обе версии Cake включают код, который заботится о слишком высоком параметре page:

Торт 1.3: Controller->paginate()

if ($page === 'last' || $page >= $pageCount) {
    $options['page'] = $page = $pageCount;
} elseif (intval($page) < 1) {
    $options['page'] = $page = 1;
}

Торт 2.3: PaginatorComponent->paginate()

$pageCount = intval(ceil($count / $limit));
$page = max(min($page, $pageCount), 1);

Но что интересно, в Cake 2.3 этот код помещается после вызова find(), так что слишком поздно для правильного извлечения записей. Это может быть никогда не сигнализируемая ошибка.

person nIcO    schedule 01.12.2012
comment
Извините, что так долго не отвечаю, конечно, вы правы. Я решил проблему, изменив метод PaginatorComponent-›paginate(), и теперь все работает нормально. Спасибо! - person alex.ac; 10.12.2012

У меня нет приложений, использующих paginator для игры, так что это будет слепым. Вы можете сделать что-то вроде:

$page_count = $this->Paginator->params['paginator']['count'];
$page_requested = $this->request->params['paginator']['page'];

if($page_requested > $page_count){
    //Redirect to last page .....
}

Хотя мне трудно поверить, что они удалили эту функциональность по умолчанию в версии 2.x.

Я бы сделал pr($this->params);, чтобы получить точные индексы в объекте paginator, которые вам нужны.

person Tim Joyce    schedule 30.11.2012
comment
Я добавил параметры в вопросе выше. Параметры пагинатора правильные, но перенаправление не выполняется. Я знаю, это глупо, тем более, что это работало в версии 1.3. Теперь я думаю, что проверка номера страницы должна выполняться в контроллере, но Paginator является помощником и должен использоваться в представлении, верно? Любые идеи о том, как решить эту проблему? - person alex.ac; 01.12.2012
comment
Как вы отправляете $appointments в представление? $this-›set('Встречи', $this-›paginate('Встреча')); ? Это все выглядит правильно. Ничего особо не торчит. - person Tim Joyce; 01.12.2012
comment
Да, пагинация работает, но если я изменю param page:4 из url (а у меня всего 3 страницы), то вместо того, чтобы перенаправить меня на последнюю страницу, он пытается показать результаты со страницы 4 (и, конечно, там нет). Я почти уверен, что CakePHP1.3 перенаправлял на действительный номер страницы вместо того, чтобы пытаться показать страницу, которой не существует. - person alex.ac; 01.12.2012
comment
Это проблема, потому что у меня также есть функция удаления, и если я буду продолжать удалять строки с последней страницы и каждый раз перенаправлять обратно на нее, в какой-то момент я закончу перенаправлением на страницу, на которой нет результатов. - person alex.ac; 01.12.2012