Cgridview Запомнить Позицию

Добрый день!

имеется стандартный CRUD - CGridView выводит данные в таблицу с возможностью правки.

вывод пагинацией разбит, скажем, на 50 страниц.

  1. Пользователь ищет то, что ему нужно, переходит, например, на 20 страницу - потом нажимает "редактирование" - и переходит на update.

исправил - нажал сохранить - и должен вернуться на ту же 20 страницу.

2)Нажимает advanced search - и отбирает, например, все компании из Москвы. Потом опять нажимает "редактирование" - и переходит на update.

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

как можно реализовать указанный функционал - есть какие-то стандартные фишки или как это лучше сделать?

Подробностей как у меня сейчас сделано не указываю, практически стандартный CRUD, да и важнее сам принцип, как это сделать.

Спасибо.

Сохраняйте значения в сессию, при загрузке проверяйте ее.

Самый простой вариант (но очень некрасивый):




public function actionAdmin() {

                $model = new Post('search');

                $model->unsetAttributes();

                if (isset($_GET['Post']))

                {

                    $model->setAttributes($_GET['Post']);

                    Yii::app()->session['Post'] = $_GET['Post'];

                } else {

                     if (isset(Yii::app()->session['Post']))

                        {

                           $model->setAttributes(Yii::app()->session['Post']);

                        }

                }       

                $this->render('admin', array(

                        'model' => $model,

                ));

        }



Красивее и более гибко будет сделать behavior. Вот здесь можете посмотреть нечто подобное - http://www.yiiframework.com/extension/remember-filters-gridview/

Спасибо!

Сам примерно так и думал

а вот тут конечно интереснее, правда не совсем понятно как сделать, как-то с behavior-ом не приходилось работать.

Ну да надо будет ман посмотреть.

Спасибо!

You can use

Yii::app()->user->setState(‘var_name’,value); for store the value and

To retrieve the value

Yii::app()->user->getState(‘var_name’);

So while searching you can store value and while going back to admin control you can use that stored value.

С отбором вроде получается, а вот как сохранить номер страницы на которой находится?

Чтоб сразу открыть пагинатор на нужной странице?

Точно так же. Сохраняйте параметр page, при восстановлении передавайте.

Увы, не могу найти куда прописать этот page в CGridView.

ну правда сделал пока так - записываю в $_GET - вроде работает


		if (isset($_GET['CmrClients_page'])) 

		{

			Yii::app()->session['CmrClients_page'] = $_GET['CmrClients_page'];;

		} else 

		{

			if (isset(Yii::app()->session['CmrClients_page']))

			{

				$_GET['CmrClients_page'] = Yii::app()->session['CmrClients_page'];

			}

		}



CmrClients - это контроллер, как у Вас - Post

А параметр CmrClients_page - передается при ajax-обновлении грида.

А вот в самом гриде какого-нибудь параметра типа


'page' => $page,

не нашел

Выставьте в методе где формируете dataProvider (обычно $model->search())




$dataProvider->pagination->currentPage = Yii::app()->session['CmrClients_page'];



Должно работать, если же нет - вам никто не мешает делать редирект на страницу index.php?CmrClients_page=5 например, но это лишнее - верхний код должен работать.

P.S. Контроллер я написал просто для примера, насколько он рабочий не знаю.

Понятно, большое спасибо !

Правда выявилась еще один момент - поскольку сохраняем данные о текущей странице в сессии, то при переходе на первую страницу попадаем… на ту же страницу, где и находились до этого, например на 20 :)

Поскольку ссылка на 20 страницу выглядит как url&controller_page=20, а на первую страницу - просто как url.

Как поменять ссылку на первую страницу в пагинаторе?

Собственно поправил файл /framework/web/CPagination.php


        public function createPageUrl($controller,$page)

        {

                $params=$this->params===null ? $_GET : $this->params;

                if($page>0) // page 0 is the default

                        $params[$this->pageVar]=$page+1;

                else

                        unset($params[$this->pageVar]);

                return $controller->createUrl($this->route,$params);

        }




Поправил эту строчку - сделал так (поставил >= вместо >):


                if($page>=0) // page 0 is the default



Но может есть более правильный способ, без правки кода самого фреймворка?