2015-04-01 4 views
1

Я использую CakePHP 1.3 Paginator, он отлично работает, кроме этого:CakePHP извлекает страницы более предела

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

http://example.com/blog/5

I добьется последней страницы, но если я доступ к

http://example.com/blog/10

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

Моя конфигурация выглядит так:

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

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

Вы прямо написали номер страницы в URL-адресе.Потому что в картировании страницы cakephp будет отображаться только точное количество страниц. –

+0

Да, я пишу номер для целей тестирования, даже если этого не должно произойти, факт заключается в том, что сканеры могут найти такие URL-адреса, поэтому я не хотите иметь несколько URL-адресов с одним и тем же контентом, для SEO слишком плохо – Balder

+0

Возможно, это решение, задав атрибут max-limit для разбивки на страницы. попробуйте и проверьте –

ответ

1

Ну, вот, к сожалению, как это работает until 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; 

// ... 

Значит, у вас есть только один вариант, calculate the page count и используйте его для проверки текущей страницы.

+0

Я боялся, что это будет проблема, спасибо вам в любом случае! – Balder

0

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

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

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

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

В этом файле я поставил весь метод постраничного, и сделать один и легко исправить, как раз перед точкой @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; 
     } 

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

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

class AppController extends PagerController 
{ 
    ..... 
} 

и она прекрасно работала, я бы смог обновить CakePHP 1.3 версии (опять же, если когда-нибудь случится), не колеблясь, а также не видя кодирование для уродливого метода постраничного.

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