Cakephp извлекает страницы сверх лимита

Я использую paginator cakephp 1.3, он работает нормально, за исключением этого:

если у меня есть 5 страниц, доступ по этому виду URL

http://example.com/blog/5

Я получу последнюю страницу, но если я получу доступ к

http://example.com/blog/10

Я также получаю прошлой стр. Но я не хочу получать какие-либо значения, так как это недопустимая страница.

Моя конфигурация такая:

  var $paginate = array(
'Post' => array(
'limit' => 10,
'order' => array('Post.id' => 'desc')
)
);

$posts = $this->paginate('Post');

1

Решение

Ну вот к сожалению как это работает до CakePHP 2.3, и он похоронен в середине Controller::paginate() метод:

https://github.com/cakephp/cakephp/blob/1.3.20/cake/libs/controller/controller.php#L1214-L1215

// ...

if ($page === 'last' || $page >= $pageCount) {
$options['page'] = $page = $pageCount;

// ...

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

1

Другие решения

Если кто-то заинтересуется этим вопросом для cakephp 1.3, я объясню свое решение на основе ответа @ndm.

Сценарий следующий

  • Метод Paginate не работает хорошо, поэтому мне нужно переписать его
  • Я не хочу обновлять файл cake \ controller.php, потому что, когда я обновляю версию с последней веткой 1.3 (если это когда-нибудь произойдет), мне придется ее исправлять, и проблема в том, что я, вероятно, забуду это сделать.
  • Я не хочу кодировать исправление в app_controller, потому что метод разбиения на страницы слишком длинный и код кажется шумным.

Поэтому я решил создать новый PageController, который расширит класс Controller и будет расширен за счет AppController.

В этом файле я поместил метод ВСЕГО paginate и сделал одно простое исправление, прямо перед упоминанием точки @ndm:

        if ($page >= $pageCount)
{
return array(); //return empty array, so no rows found.
}

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

Наконец, я использовал include, чтобы AppController нашел PagerController:

<?php
include("pager_controller.php");

class AppController extends PagerController
{
.....
}

И это сработало отлично, я мог бы обновить версию cakephp 1.3 (опять же, если это когда-нибудь произойдет), не задумываясь, а также не увидев кодировку для уродливого метода paginate.

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

0

По вопросам рекламы [email protected]