Добрый день!
имеется стандартный CRUD - CGridView выводит данные в таблицу с возможностью правки.
вывод пагинацией разбит, скажем, на 50 страниц.
Пользователь ищет то, что ему нужно, переходит, например, на 20 страницу - потом нажимает "редактирование" - и переходит на update.
исправил - нажал сохранить - и должен вернуться на ту же 20 страницу.
2)Нажимает advanced search - и отбирает, например, все компании из Москвы. Потом опять нажимает "редактирование" - и переходит на update.
исправил - нажал сохранить - и должен вернуться на ту же страницу и с теми же данными, которые он отобрал - в нашем примере компании из Москвы.
как можно реализовать указанный функционал - есть какие-то стандартные фишки или как это лучше сделать?
Подробностей как у меня сейчас сделано не указываю, практически стандартный CRUD, да и важнее сам принцип, как это сделать.
Спасибо.
ineersa
(Ineersa)
May 7, 2014, 8:25am
2
Сохраняйте значения в сессию, при загрузке проверяйте ее.
Самый простой вариант (но очень некрасивый):
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-ом не приходилось работать.
Ну да надо будет ман посмотреть.
Спасибо!
khushal
(Khushal Fadiya)
May 7, 2014, 8:58am
4
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.
С отбором вроде получается, а вот как сохранить номер страницы на которой находится?
Чтоб сразу открыть пагинатор на нужной странице?
ineersa
(Ineersa)
May 7, 2014, 12:00pm
6
Точно так же. Сохраняйте параметр 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,
не нашел
ineersa
(Ineersa)
May 7, 2014, 2:51pm
8
Выставьте в методе где формируете dataProvider (обычно $model->search())
$dataProvider->pagination->currentPage = Yii::app()->session['CmrClients_page'];
Должно работать, если же нет - вам никто не мешает делать редирект на страницу index.php?CmrClients_page=5 например, но это лишнее - верхний код должен работать.
P.S. Контроллер я написал просто для примера, насколько он рабочий не знаю.
ineersa:
Выставьте в методе где формируете dataProvider (обычно $model->search())
$dataProvider->pagination->currentPage = Yii::app()->session['CmrClients_page'];
Должно работать, если же нет - вам никто не мешает делать редирект на страницу index.php?CmrClients_page=5 например, но это лишнее - верхний код должен работать.
P.S. Контроллер я написал просто для примера, насколько он рабочий не знаю.
Понятно, большое спасибо !
kolossus
(Mbook)
May 17, 2014, 7:53pm
10
Правда выявилась еще один момент - поскольку сохраняем данные о текущей странице в сессии, то при переходе на первую страницу попадаем… на ту же страницу, где и находились до этого, например на 20
Поскольку ссылка на 20 страницу выглядит как url&controller_page=20 , а на первую страницу - просто как url .
Как поменять ссылку на первую страницу в пагинаторе?
kolossus
(Mbook)
May 18, 2014, 6:01pm
11
Собственно поправил файл /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
Но может есть более правильный способ, без правки кода самого фреймворка?