вторник, 6 сентября 2011 г.

Поиск в CGridView

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

Если указан параметр filter - в таблице выводятся поля ввода. По их значениям и будет фильтроваться выборка.

Во view инициализируем виджет CGridView, в параметрах надо указать модель для фильтрации.

View:
// $model - переданная модель из контроллера
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'profiles',
'dataProvider'=>$model->search(),
'filter'=>$model,

));


CGridView посылает ajax запрос на текущую страницу, с массивом в $_GET['Название_модели']. Этот массив - атрибуты модели. Их можно присвоить модели для выборки. По сути так и происходит фильтрация.

Итак, в текущем действии контроллера (текущем, значит в котором выводится таблица):

Controller:
public function actionUsers()
{
// Создаем модель
$model = User::model();
/* Не забудьте в rules модели указать нужные поля как 'safe', 'on'=>'search'
иначе по ним поиск будет невозможен.
*/
$model->setScenario('search');
//
if(isset($_GET['User'])) {
// Присваиваем модели полученные атрибуты
$model->attributes = $_GET['User'];
}
// В рендер передаем переменную $model
$this->render('users', array('model'=>$model));
}


Такой простейший пример весьма сложно найти, как правило, везде подразумевается, что он известен по умолчанию.