Как вы поддерживаете номер страницы после перенаправления в CakePHP? - PullRequest
1 голос
/ 28 июня 2009

У меня есть индексное представление, в котором перечислены элементы, и это длинный список, поэтому я использую Paginator, чтобы ограничить элементы до 50 для просмотра.

Каждый элемент имеет ссылку «редактировать», которая ведет к представлению редактирования с вводами / проверками / и т. Д. Когда эта форма отправлена, я перенаправляю использование обратно в представление индекса.

Пока все хорошо, но вот загвоздка:

Если пользователь находится на странице N индекса и нажимает кнопку «Редактировать и редактировать элемент», я хочу, чтобы его перенаправили обратно на страницу N индекса. Если бы я знал номер страницы, я мог бы просто вставить "/ page: N" в конец URL, но я понятия не имею, как я могу получить номер страницы. (N может быть любым номером страницы, но особенно> = 2)

Любые идеи будут оценены.

Ответы [ 5 ]

2 голосов
/ 29 июня 2009

Я создал компонент, который сохраняет страницу в сеансе. Затем в 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;
    }
2 голосов
/ 04 февраля 2010

Если я правильно понимаю, вышесказанное хорошо для редактирования, но не для добавления. Это решение должно работать в обеих ситуациях:

В ваших контроллерах или в /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;
  }

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

2 голосов
/ 29 июня 2009

Номер страницы должен быть частью переменной $ params в представлении списка. Просто прикрепите его к концу ссылки редактирования и обработайте его оттуда. На странице редактирования вам понадобится способ ввести необязательный номер страницы, сохранить его при отправке любой формы и вернуться к списку с тем же номером страницы.

1 голос
/ 13 октября 2010

делает простой

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

работает

0 голосов
/ 17 сентября 2014

с учетом нумерации страниц:

<?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());          
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...