2009-06-28 5 views
1

필자는 항목을 나열하는 인덱스보기가 있으며 긴 목록이므로 Paginator를 사용하여 항목을 50 개로 제한합니다.CakePHP에서 리디렉션 한 후 어떻게 페이지 번호를 유지합니까?

각 항목에는 입력/유효성 검사/등이있는 편집보기로 이동하는 "수정"링크가 있습니다. 해당 양식이 제출되면 사용법을 다시 색인보기로 리디렉션합니다.

지금까지 너무 좋아하지만, 여기에 문지의 : 사용자가 인덱스의 페이지 N에 그들은 내가 그들을 인덱스의 페이지 N에 다시 리디렉션하려면 편집을 클릭하고 항목을 편집하는 경우

. 페이지 번호를 알고 있다면 URL 끝 부분에 "/ page : N"을 붙일 수는 있지만 페이지 번호를 어떻게 얻을 수 있는지 알 수 없습니다. (N은 임의의 페이지 번호 일 수 있지만 특히 => 2)

어떤 아이디어라도 받아 들여질 것입니다.

+0

일부 코드가 도움이 될 것입니다. 페이지 번호를 "편집"링크에 입력해야 할 것입니다. – slosd

답변

2

페이지 번호는 목록보기에서 $ params var의 일부 여야합니다. 그냥 편집 링크 끝 부분에 붙이고 거기에서 처리하십시오. 편집 페이지에서 옵션 페이지 번호를 가져 와서 양식 제출 중에 저장하고 동일한 페이지 번호를 사용하여 목록으로 다시 전달하는 방법이 필요합니다.

+0

그건 내가 생각한 것 같아. 나는 CakePHP가 이미 더 나은 방법을 가지고 있기를 바랬다. 고마워. –

2

세션에 페이지를 저장하는 구성 요소를 만들었습니다. 그런 다음 app_controller.php에서 세션에서 사용중인 특정 모델이 있는지 확인한 다음 URL에 추가합니다. 구성 요소의 코드에 관심이 있으시면 메시지를 보내주십시오. 사용자가 편집하기 전에 색인 페이지에서 정렬 순서를 변경 한 경우에도 순서를 저장합니다.

소스 여기를 참조하십시오 : 여기 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

Jason 나는 이것을 언급하지 않았지만, 세션을 사용하지 않기를 바랄 것이다.하지만 대답은 매우 좋았고. 나는 아직도 그것을 들여다 볼 것이다. –

+1

나는 모든 컨트롤러에서 작동하기 때문에 솔루션을 좋아합니다. 매우 일반적인 문제이며 사용자가 페이지 매김이 지속되기를 기대하기 때문입니다. – jimiyash

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}"); 

... 그리고 뭔가를 편집 :

를 당신의 /app/app_model.php에서
$page = $this->{$this->modelClass}->getPageNumber($id, $this->paginate['limit']); 
$this->redirect("/admin/{$controllerName}/index/page:{$page}"); 

이에 넣어 : 도움이

/** 
* 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

1

간단한

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

일을합니까?매기기로보기에서

+0

Nope. : (그냥 해봤 어. – mikermcneil

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'])); 
?> 

을 편집 링크 :

public function edit($post_id, $pageToRedirect = false){ 

    //after all editing its done redirect 

    if($pageToRedirect){ 
    // if record was last in pagination page redirect to previous page 
    $pageToRedirect = $pageToRedirect -1; 
    return $this->redirect(array('action' => 'index/page:'.$pageToRedirect)); 
    }else{ 
    // else redirect to the same pagination page 
    $this->redirect($this->referer());   
    } 

}