Статистика

Участников проекта 105
Опубликовано статей 78
Отчет по карме. Топ 20

Новости блога

1 29.11.2013  Сегодня самым активным участникам newblog'а был выплачен доход с sape.
7 02.11.2012  Ура! Свешилось, нашему сайту дали тИЦ 10. Спасибо всем кто принимает участие в развитии нашего блога.
8 21.08.2012  Интеграция с sape.ru. Теперь каждый автор статей на newblog автоматически зарабатывает на рекламе.
Все новости

Топ 5 категорий

Программирование 46
Операционные системы 9
Базы данных 4
Туризм 2
Заметки 2

Последние 5 заметок (90)

gullyar - Закладки gullyar
gullyar - Ваша первая закладка
osadchaya - Закладки osadchaya
Ira0231188 - Закладки Ira0231188
Ira0231188 - Закладки Ira0231188

Ссылки

www.freedev.asia

Paginator и хитрые редиректы с сохранением открытой страницы в CakePHP

13.10.2011 15:28 | Просмотров: 4124 | Доход: 49.22 руб. | Комментариев: 2
[Программирование] 
Рейтинг: 5/2

Каждый из нас бывал в ситуации, когда необходимо после изменения записи вернуться на страницу со списком записей в том же состоянии в котором и покидал его до редактирования. К примеру, чтобы была открыта страница с номером 3 и при этом сохранилась сортировка по возрастанию на поле "Название товара".

Функции сохранения параметров Paginator в CakePHP не имеет, но при этом все настройки идут именованными параметрами в строке запроса: ttp://yoursite.com/pages/index/page:5/sort:title/direction:asc. Эта строка сформирована Paginator автоматически и сдесь, как вы можете видеть, указана 5я страница, и сортировка по возрастанию для поля title".

Предлагаю, и не навязываю, Вам вариант обработки и хранения этих парметров автоматически и без всяких костылей. Идея проста - автоматически протащить эти параметры на вторую страницу и вернуть их при переходе обратно. Для реализации вам понадобиться выполнить всего лишь 3 действия :

  • подкорректировать пагинатор для вывода ссылок;
  • модернизировать функцию redirect в app_controller.php;
  • указать стилизованную ссылку в нужно месте.

NOTES Будьте внимательны, параметры передаются get-ом, совпадения именованных параметров пагинатора на другой странице может привести к неожиданныму результату. Если вы у себя на странице интерпретируете именованный параметр page как id для поиска записи, а также другие параметры title и sort еще для чего-то, то такой метод вам не подойдет.

Создайте новый хелпер в папке app/views/helpers/mypaginator.php и разместите в него следующий код:

<?php
App::import('Helper', 'Paginator');

class MyPaginatorHelper extends PaginatorHelper{
  
	var $helpers = array('Html', 'Form');
	
	function __construct(){
		parent :: __construct();
	}
	// ссылка с сохранением параметров пагинатора
	function link($title = 'Ссылка', $url = array(), $attributes = null){
		return $this->Html->link( $title, array_merge($url, $this->url(array(), true)),	$attributes); 
	}
        // ссылка для возврата
	function linkBack($title = 'Вернуться', $url = array(), $attributes = null){
		if(isset($this->params['named']) && $this->params['named'])
    		$url = array_merge($url, $this->params['named']);
		return $this->Html->link( $title, $url, $attributes);
	}
}
?>

После этого исключите из вашик хелперов в контроллере стандартный пагинатор Paginator и подключите MyPaginator. Не бойтесь, все функции что указаны у вами во вьювах $this->Paginator-><имя_функции> будут работать также и без изменений.  Теперь можно вставить ссылку на страницу таким образом:

// переход на форму добавления
$this->Mypaginator->link('Добавить запись', array('action'=>'add'));

// ссылка на возврат в список
$this->Mypaginator->linkBack('Вернуться', array('action'=>'index'));

Третьим действием обновим функцию редиректа в app_controller.php, добавив тута код:

    function redirect($url, $status = null, $exit = true) {
    	if(isset($this->params['named']) && $this->params['named'])
    		$url = array_merge($url, $this->params['named']);
    	parent::redirect($url, $status, $exit);
    }	

 

Пробуйте теперь жать на ссылку "Добавить запись" и возврашаться обратно в список через ссылку "Вернуться". Также сохранение параметров выполниться если вы используете в функции при возврате вызов redirect

$this->redirect(array('action'=>'index'));

В закрытом разделе небольшой бонус - оформление постраничных ссылок  :) Удачной работы и "кулинарных" свершений!

Печь пирожки не так уж и сложно, да еще и когда тебе в этом помогают. Бонус к твоему пагинатору - стили для оформления постраничной навигации.Для удобства вывода навигации в конце списка  добавь в твой только что испеченный хелпер следующую функцию:

// постраничное разбиение
function paging(){
	return 	$this->first('<< ', array(), null, array('class'=>'disabled')).
		$this->prev('<- сюда ', array(), null, array('class'=>'disabled')).
		$this->numbers(array('separator' => '')).
		$this->next('туда ->', array(), null, array('class' => 'disabled')).
		$this->last('>> ', array(), null, array('class'=>'disabled'));
}

Вызывай так на странице:

<div class="pages"><?php echo $this->Mypaginator->paging();?></div>

И  добавить немного стилей для оформления ( у меня был фон темный, так что пошаманете с цветами )

/* Paging */
.pages	                { background-color: #505050; height: 30px }
.pages div.disabled 	{ color: #363636; margin: 0 2px 0 2px; cursor: default; display: inline	}
.pages span 		{ color:#C5E7F3; margin: 2px 4px 2px 4px }
.pages span.current 	{ padding: 0 4px 0 4px; border:1px solid #C5E7F3 }
.pages a		{ color:#C5E7F3; border:1px solid #505050 }
.pages a:hover 		{ color:#C5E7F3; border:1px solid #C5E7F3 }
.pages span a 		{ color:#C5E7F3; padding: 0 4px 0 4px; border:1px solid #505050 }
.pages span a:hover 	{ border:1px solid #C5E7F3 }

Результат использования кода выше - симпатичный постраничный навигатор с минимой затрат на продумывание стиля оформления  )))


© niichi
| Комментировать статью |
  • GM +2587 (13.10.2011 15:48)
    круто! :)
    | Ответить |
    • niichi +51 (17.10.2011 09:32)
      пасиба, надеюсь юзаешь ... скорее всего будет продолжение, про фильтрацию списка ... to be continue :P
      | Ответить |