2009-06-28 59 views
1

我有一個列出項目的索引視圖,它是一個很長的列表,所以我使用Paginator將項目限制爲50個視圖。如何在CakePHP重定向後維護頁碼?

每個項目都有一個「編輯」鏈接,通過輸入/驗證/等進入編輯視圖。提交表單時,我將該用戶重定向回索引視圖。

到目前爲止好,但這裏的難題是:如果用戶是對指數的頁面N和他們點擊編輯和編輯項目,我希望他們能夠被重定向回索引的N頁

。如果我知道頁碼,我可以將「/ page:N」粘貼到URL的末尾,但我不知道如何獲取頁碼。 (N可以是任何頁碼,但特別是> = 2)

任何想法,將不勝感激。

+0

一些代碼將是有益的。您可能必須將頁碼放在「編輯」鏈接中。 – slosd 2009-06-28 20:24:33

回答

2

頁碼應該是列表視圖中$ params var的一部分。只需將它粘貼到編輯鏈接的末尾並從那裏處理即可。在編輯頁面上,您需要一種方法來獲取可選的頁碼,在任何表單提交過程中存儲它,然後轉發回具有相同頁碼的列表。

+0

這是有點我想,我只是希望CakePHP有一個更好的方式已經內置。謝謝 – 2009-06-29 13:25:16

2

我創建了一個組件,將頁面保存在會話中。然後在app_controller.php中,我檢查會話中是否有任何正在使用的特定模型,然後將其添加到網址中。如果您對該組件的代碼感興趣,請通知我。如果用戶在編輯之前更改了索引頁中的排序順序,我也會存儲該順序。

看到這裏來源: http://github.com/jimiyash/cake-pluggables/blob/a0c3774982c19d02cfdd19a2977eabe046a4b294/controllers/components/memory.php

下面是我在做什麼的要點。

//controller or component code 
if(!empty($params['named']) && !empty($params['controller']) && $params['action'] == 'admin_index'){ 
    $this->Session->write("Pagem.{$params['controller']}", $params['named']); 
} 

//app_controller.php 
    $redirectNew = ""; 
    if(is_array($redirectTo)){ 
     if(!empty($params['prefix']) && $params['prefix'] == 'admin'){ 
      $redirectNew .= '/admin'; 
     } 
     if(!empty($params['controller'])){ 
      $redirectNew .= "/" . $params['controller']; 
     } 
     if(!empty($redirectTo['action'])){ 
      $redirectNew .= "/" . $redirectTo['action']; 
     } 
    } else { 
     $redirectNew = $redirectTo; 
    } 

    $controller = $params['controller']; 
    if($this->Session->check("Pagem.$controller")){ 
     $settings = $this->Session->read("Pagem.$controller"); 
     $append = array(); 
     foreach($settings as $key=>$value){ 
      $append[] = "$key:$value"; 
     } 
     return $redirectNew . "/" . join("/", $append); 
    } else { 
     return $redirectNew; 
    } 
+0

賈森我沒有提到這一點,但我不想用這個會話,但你的答案是非常好的,我仍會研究它。 – 2009-06-29 13:24:35

+1

我喜歡該解決方案,因爲它適用於所有控制器,因爲這是一個非常常見的問題,用戶希望分頁是持久的。 – jimiyash 2009-06-30 01:25:21

2

如果我理解正確的話,以上是編輯好,但不適用於添加。該解決方案應爲這兩種情況下工作:

在您的控制器或你的/app/app_controller.php,放像這樣添加:

$insertID = $this->{$this->modelClass}->getLastInsertID(); 
$page = $this->{$this->modelClass}->getPageNumber($insertID, $this->paginate['limit']); 
$this->redirect("/admin/{$controllerName}/index/page:{$page}"); 

...而像這樣編輯:

$page = $this->{$this->modelClass}->getPageNumber($id, $this->paginate['limit']); 
$this->redirect("/admin/{$controllerName}/index/page:{$page}"); 

在你/app/app_model.php,把這個:

/** 
* Work out which page a record is on, so the user can be redirected to 
* the correct page. (Not necessarily the page she came from, as this 
* could be a new record.) 
*/ 

    function getPageNumber($id, $rowsPerPage) { 
    $result = $this->find('list'); // id => name 
    $resultIDs = array_keys($result); // position - 1 => id 
    $resultPositions = array_flip($resultIDs); // id => position - 1 
    $position = $resultPositions[$id] + 1; // Find the row number of the record 
    $page = ceil($position/$rowsPerPage); // Find the page of that row number 
    return $page; 
    } 

希望幫助!

+0

getPageNumber可能是一個性能問題。我不會在大型系統上使用。 – Martin 2013-07-25 04:07:19

1

執行一個簡單的

$this->redirect($this->referer()); 

的作品?

0

考慮到與分頁程序:

<?php 
if ($this->Paginator->hasPage(null, 2)) { 
$pag_Start = $this->Paginator->counter('{:start}'); 
$pag_End = $this->Paginator->counter('{:end}'); 
if($pag_Start == $pag_End){ 
$pageToRedirect = $this->Paginator->current('Posts'); 
}else{ 
$pageToRedirect= ''; 
}}?> 

然後鏈接到編輯頁面

<?php 
echo $this->Form->postLink(
'Edit', 
array('action' => 'edit', $subscription['Post']['id'])); 
?> 

在控制器:

​​