Как вы сохраняете номер страницы после перенаправления в CakePHP?
-
20-08-2019 - |
Вопрос
У меня есть индексное представление, в котором перечислены элементы, и это длинный список, поэтому я использую Paginator, чтобы ограничить количество элементов до 50 на просмотр.
Каждый элемент имеет ссылку "редактировать", которая ведет к виду редактирования с входными данными / проверками / и т.д.Когда эта форма отправлена, я перенаправляю use обратно в индексное представление.
Пока все хорошо, но вот в чем загвоздка:
Если пользователь находится на странице N индекса и нажимает редактировать и редактирует элемент, я хочу, чтобы он был перенаправлен обратно на страницу N индекса.Если бы я знал номер страницы, я мог бы просто вставить "/ page: N" в конец URL-адреса, но я понятия не имею, как я могу получить номер страницы.(N может быть любым номером страницы, но особенно >=2)
Любые идеи будут оценены по достоинству.
Решение
Номер страницы должен быть частью переменной $params в представлении списка.Просто прикрепите его к концу ссылки редактирования и обрабатывайте его оттуда.На странице редактирования вам понадобится способ ввести необязательный номер страницы, сохранить его во время отправки любой формы и перенаправить обратно в список с тем же номером страницы.
Другие советы
Я создал компонент, который сохраняет страницу в сеансе.Затем в 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;
}
Если я правильно понимаю, вышесказанное подходит для редактирования, но не для добавления.Это решение должно работать в обеих ситуациях:
В ваших контроллерах или вашем /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;
}
Надеюсь, это поможет!
Выполняет простую
$this->redirect($this->referer());
работает?
В поле зрения с помощью пагинатора:
<?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());
}
}