CGridView и фильтрация

Всем привет!

Возникли небольшие трудности с фильтрацией при использовании CGridView.

Как я понял из примеров на форуме, в dataProider мы помещаем $model->search()




    'dataProvider'=>$model->search(),

    'filter'=>$model,

    'columns'=>array(

        array(

            'name'=>'title',



и настраиваем в модели функцию search(), которая возвращает CActiveDataProvider с критериями.

А как быть, если нужно указать дефолтовые критерии поиска и постраничный вывод? Править все туже функцию search в модели? или есть другой вариант?

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

гриду передаю CActiveDataProvider а как сделать фильтр совсем понять не могу.

документация совсем слабая (

Собственно там же идет CDbСriteria.

Вот код который сгенерен yiic




	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;


		return new CActiveDataProvider('Category', array(

			'criteria'=>$criteria,

		));

	}



соотвественно тут уже подставляем дефолтные условия.

я создавал без yiic код

не видел такого

но вот мой код и я не совсем врубаюсь как прикрутить фильтр




        // Это экшен

	public function actionIndex() {		

		$dataProvider = new CActiveDataProvider('products', array(

			'criteria' => array(

				'with' => array('manufacturers', 'categories'),

			),

			'pagination' => array(

				'pageSize' => Yii::app()->params['perPage'],

			)

		));

		

		$this->render('index', array('provider' => $dataProvider));

	}




        // вьюха для него

$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'products-table',

    'dataProvider' => $provider,

    'selectableRows' => Yii::app()->params['perPage'],

    'ajaxUpdate' => false,

    'columns'=>array(

        array(

        	'class' => 'CCheckBoxColumn',

        	'checkBoxHtmlOptions' => array('name' => 'values[]', 'class' => 'ch'),

        	'id' => 'values',

        	),

        array(

        	'name' => 'ID',

        	'value' => '$data->id',

        	'htmlOptions' => array('align' => 'center'),

        	),

        array(

        	'name' => '1С код',

        	'value' => '$data->code',

        	'htmlOptions' => array('align' => 'center'),

        	),

        array(

        	'name' => 'Название',

        	'value' => '$data->name',

        	),

        array(

        	'name' => 'Категория',

        	'value' => '$data->categories->name',

        	'filter' => array('0' => 'Без категории', '1' => 'Категория 1'),

        	),

        array(

        	'name' => 'Производитель',

        	'value' => '$data->manufacturers->name',

        	),

        array(

        	'name' => 'Тэги',

        	'value' => 'Format::productTags($data->id)',

        	),

        array(

        	'name' => 'Цена',

        	'value' => 'Price::format($data->price)',

        	'htmlOptions' => array('align' => 'right'),

        	),

        array(

        	'name' => 'Тип',

        	'value' => 'Format::productType($data)',

        	'htmlOptions' => array('align' => 'center'),

        	),

        array(   

            'name' => 'Дата создания',

            'value' => 'Yii::app()->locale->dateFormatter->formatDateTime($data->create_date, "long")',

            'htmlOptions' => array('align' => 'center'),

        ),

        array(   

            'class'=>'CButtonColumn',

            'template'=>'{off} {on} {edit} {del}',

            'buttons'=>array(

            		'off' => array(

            			'label' => 'Включить',

            			'imageUrl' => '/images/admin/yii_icon_no.gif',

            			'visible' => '$data->status == 0',

            			'url'	=> 'Yii::app()->controller->createUrl("products/status", array("id" => $data->id, "page" => $this->grid->dataProvider->pagination->currentPage+1, "status" => 1))',

            		),

            		'on' => array(

            			'label' => 'Выключить',

            			'imageUrl' => '/images/admin/yii_icon_yes.gif',

            			'visible' => '$data->status == 1',

            			'url'	=> 'Yii::app()->controller->createUrl("products/status", array("id" => $data->id, "page" => $this->grid->dataProvider->pagination->currentPage+1, "status" => 0))',

            		),

            		'edit' => array(

            			'label' => 'Редактировать',

            			'imageUrl' => '/images/admin/update.png',

            			'url'	=> 'Yii::app()->controller->createUrl("products/edit", array("id" => $data->id, "page" => $this->grid->dataProvider->pagination->currentPage+1))'

            		),

            		'del' => array(

            			'label' => 'Удалить',

            			'imageUrl' => '/images/admin/delete.png',

            			'url' => 'Yii::app()->controller->createUrl("products/del", array("id" => $data->id, "page" => $this->grid->dataProvider->pagination->currentPage+1))',

            		),

				),

        ),

    ),

));




это получается мне надо отказаться от CActiveDataProvider, написать в модели выборку данных, там же сделать метод search().

я правильно понимаю ?

Не обязательно. Нужно только передать гриду модель, а при получении запроса на action настроить DataProvider, примерно так:




        // Это экшен

	public function actionIndex() {		

		$dataProvider = new CActiveDataProvider('products', array(

			'criteria' => array(

				'with' => array('manufacturers', 'categories'),

			),

			'pagination' => array(

				'pageSize' => Yii::app()->params['perPage'],

			)

		));

		

                $model=new Products('search');

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

                   $model->attributes=$_GET['Products'];


                // здесь добавить все поля модели, по которым нужен поиск

                $dataProvider->criteria->compare('title',$model->title,true);


		$this->render('index', array('provider' => $dataProvider, 'model'=>$model));

	}




        // вьюха для него

$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'products-table',

    'dataProvider' => $provider,

    // тут добавить модель для фильтра, переданную из контроллера

    'filter' => $model,

    'selectableRows' => Yii::app()->params['perPage'],

    'ajaxUpdate' => false,

    'columns'=>array(

          ...

        ),

    ),

));




оки, попробую.

но у меня вот какая проблема.

как-то так я уже примерно делаю, но у меня почему-то крашится скрипт, он пытается создать active***Field с именем стоблика.

и название поля берет с ключа ‘name’, а там собственно русские названия полей.

пока не понял почему, но вот возникла идея что может надо выключить фильтрацию для этого поля.

но опять возникает вопрос а как решить эту проблему с колонкой, по которой надо фильтровать

нашел, вместо ‘name’ надо использовать ‘header’ и тогда не будет проблем с генерацией полей фильтрации

Зачем? Если можно вначале создать CDbCriteria , и передать его в конструкторе к CActiveDataProvider.





        public function actionIndex() {     


                $criteria = new CDbCriteria;

                /**

                * Some actions with $criteria

                */


                $dataProvider = new CActiveDataProvider('products', array(

                        'criteria' => $criteria,

                        'pagination' => array(

                                'pageSize' => Yii::app()->params['perPage'],

                        )

                ));

                


                $this->render('index', array('provider' => $dataProvider));

        }






да вроде те же яйца только в профиль )

Всё понял для чего :)