CGridView -> Filter -> model->attribute -> Array

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
return.string
Сообщения: 15
Зарегистрирован: 2010.05.19, 20:05

CGridView -> Filter -> model->attribute -> Array

Сообщение return.string »

Кто нить может обяснить как в компоненте CGridView назначить filter не "activeTextField" => "activeDropDownList".
Если посмотерть в source то я должен атрибуту присвоить array, но как это сделать ума не приложу.
По идеие я как то должен это сделать через модель, но опять же как...

Помогите люди добрые... :roll:

View:

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'project-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'project_id',
        'project_type_id',
 
return.string
Сообщения: 15
Зарегистрирован: 2010.05.19, 20:05

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение return.string »

Совсем никто не знает...???
return.string
Сообщения: 15
Зарегистрирован: 2010.05.19, 20:05

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение return.string »

Вот как то сам разобрался, наверно меня никтол не понял.
НУ вообщим если кому понадобится вот так это выглядит.

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'project-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'project_id',
        array(
            'name' => 'project_type_id',
            'filter' => array(1=>'Тип1', 2=> 'Тип2'),
        ),
...
 
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение Insolita »

Хотелось бы добавить заметочку - потому что сама долго думала и искала как организовать, в результате всё оказалось элементрано, но нигде в рецептах и примерах такое не встречала (может быть плохо искала) вдруг пригодится кому
- Задача была организовать DropDownList фильтрацию по столбцу но не по конкретным значениям, а с условиями - только нулевые значения, только не нулевые значения, значения больше 75 и значения =100

Код: Выделить всё

'columns'=>array(
        'user',
        array(
            'name' => 'score',
            'filter' => array('=0'=>'Без результата','<>0'=> 'Результативные','>75'=>'Лучшие','=100'=>'Лидеры'),
        ), 
sonoleo
Сообщения: 5
Зарегистрирован: 2012.02.16, 20:36

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение sonoleo »

Я НОВИЧОК. То, что изложено в теме - всё понятно. Я стандартно сделал своё: одно табличку, модель, контроллер и view.
В контроллере:

Код: Выделить всё

    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

     public function actionIndex()
    {
        $dataProvider = new CActiveDataProvider('Notice');
        $this->render('index',array(
            'dataProvider' => $dataProvider,
        ));
    }
В моделе есть:

Код: Выделить всё

    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'code_id' => 'Code',
            'surname' => 'Surname',
            'name' => 'Name',
            'middle' => 'Middle',
            'city' => 'City',
            'status' => 'Status',
        );
    } 
Во view:

Код: Выделить всё

<?php $this->widget('zii.widgets.grid.CGridView', array( 
'dataProvider'    => $dataProvider, 
        'filter'        => $model,
        'columns'=> array( 
                        'id', 
                        'code_id', 
                        array( 
                            'name'        => 'surname', 
                            'header'    => 'Фамилия',
                            'filter'    => array(8=>'id'),
                            'sortable'    => false, 
                        ), 
                        array( 
                            'name'        => 'name', 
                            'header'    => 'Имя',
                        ),
                        array( 
                            'name'        => 'city', 
                            'header'    => 'Город',
                        )
                    ), 
    )
);
?>
И отфильтрованных нет!
Я видел, что вместо 'dataProvider' => $dataProvider, ставят 'dataProvider' => $dataProvider->search(),
В Вашем примере: 'dataProvider'=>$model->search(),
У меня на такие выражения выдает ошибку.
Видать я не проникся пока идеологией. Может кто подскажет в чём не прав?
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение esche »

Создать при помощи gii модель и заглянуть в метод search() - там формируется criteria для поиска. Если такой метод в модели есть - проверить, какое значение в $model
...
sonoleo
Сообщения: 5
Зарегистрирован: 2012.02.16, 20:36

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение sonoleo »

Я тот показываю?

Код: Выделить всё

class Notice extends CActiveRecord
{
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Notice the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
и Search()

Код: Выделить всё

    public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('code_id',$this->code_id);
        $criteria->compare('surname',$this->surname,true);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('middle',$this->middle,true);
        $criteria->compare('city',$this->city,true);
        $criteria->compare('status',$this->status,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }
а на самое простейшее:

Код: Выделить всё

<?php $this->widget('zii.widgets.grid.CGridView', array( 
    'dataProvider'   => $dataProvider->search(), 
    'filter'              => $model,
выдает ошибку:
CActiveDataProvider and its behaviors do not have a method or closure named "search".

???
sonoleo
Сообщения: 5
Зарегистрирован: 2012.02.16, 20:36

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение sonoleo »

ку-ку, люди!!!
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение TM123 »

Ну мне кажется все понятно, вам же четко написали что в $dataProvider нет метода search. Смотрите как вы создали эту переменную и что у вас в ней по факту.
sonoleo
Сообщения: 5
Зарегистрирован: 2012.02.16, 20:36

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение sonoleo »

это в контроллере?:

Код: Выделить всё

     public function actionIndex()
    {
        $dataProvider = new CActiveDataProvider('Notice');
        $this->render('index',array(
            'dataProvider' => $dataProvider,
        ));
    }
Мне кажется, что я здесь создаю эту переменную (она автоматом создается). Может приведёте простенький примерчик метода search в $dataProvider? Забодался искать на форуме пример. :oops:
sonoleo
Сообщения: 5
Зарегистрирован: 2012.02.16, 20:36

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение sonoleo »

Спасибо TM123 за объяснение. Я же писал, что НОВИЧОК! :roll:
это смог расковырять. В models\Notice.php задал (поправил) функцию

Код: Выделить всё

    public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;
        $criteria->compare('id',$this->id);
        $criteria->compare('code_id',$this->code_id=3); // вывести только по code_id=3
        $criteria->compare('surname',$this->surname,true);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('middle',$this->middle,true);
        $criteria->compare('city',$this->city,true);
        $criteria->compare('status',$this->status,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }
а в controllers\NoticeController.php оставил только

Код: Выделить всё

    public function actionIndex()
    {
        $dataProvider = new CActiveDataProvider('Notice'
            );
        $this->render('index',array(
            'dataProvider' => $dataProvider,
        ));
    }
и получил две записи из таблицы.
Вложения
Snap1.jpg
Snap1.jpg (10.93 КБ) 3422 просмотра
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: CGridView -> Filter -> model->attribute -> Array

Сообщение TM123 »

Ну вы посмотрите что откуда вы наследуете. В модели вы описали метод search, а потом удивляетесь почему в CActiveDataProvider у вас нет того метода, который вы собственно описали в модели :)

Надо что-то типа
$dataProvider = Notice::model('search);
Ответить