2015-04-01 43 views
1

我使用CakePHP 1.3分頁程序頁面,它工作得很好,除了這一點:CakePHP的檢索超限

,如果我有5頁,通過這種鏈接的

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

你是否直接在url中寫入頁碼。因爲cakephp分頁只會顯示確切的頁數 – 2015-04-01 12:17:43

+0

是的,我正在編寫數字,用於測試目的,即使這不應該發生,事實是爬蟲可以找到這種類型的URL,所以我不會想要擁有多個具有相同內容的網址,對於SEO太差 – Balder 2015-04-01 12:44:05

+0

可以通過設置分頁的最大限制屬性來限制此解決方案。嘗試它並檢查 – 2015-04-01 13:22:55

回答

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 2015-04-01 15:52:50

0

如果有人對cakephp 1.3的這個問題感興趣,我會根據@ndm answer來解釋我的解決方案。

的情況是以下

  • 分頁方法都不盡如人意,所以我需要重寫它
  • 我不想更新的蛋糕\ 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; 
     } 

最後我用包括幫助AppController中發現PagerController:

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

class AppController extends PagerController 
{ 
    ..... 
} 

它的工作完美,我可以毫不猶豫地更新cakephp 1.3版本(再次發生),也沒有看到醜陋的分頁方法的編碼。

希望它能幫助你