CGridView Фильтр нескольких моделей - PullRequest
0 голосов
/ 22 июля 2011

Я искал и искал ответ на мою проблему, но ни один из них не помог.Моя проблема связана с фильтрацией / поиском в CGridView для Yii.

В моей модели заявителя у меня есть следующее:

private $_city = null;
private $province_id = null;
public function getCity()
    {
        if($this->_city === null && $this->address_id !== null) {
            $this->_city = $this->address->city;
        }

        return $this->_city;
    }

    public function setCity($value)
    {
        $this->_city = $value;
    }

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

        $criteria=new CDbCriteria;

        $criteria->with = array('address'=>array('alias'=>'address'));

        $criteria->compare('id',$this->id);
        $criteria->compare('phn',$this->phn);
        $criteria->compare('gender',$this->gender);
        $criteria->compare('dob',$this->dob,true);
        $criteria->compare('first_name',$this->first_name,true);
        $criteria->compare('last_name',$this->last_name,true);
        $criteria->compare('band_id',$this->band_id);
        $criteria->compare('note',$this->note,true);
        $criteria->compare('address.city',$this->city);
        $criteria->compare('address.province_id',$this->province_id);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'sort'=>array(
                'attributes'=>array(
                    'id',
                    'phn',
                    'first_name',
                    'last_name',
                    'band_id',
                    'city'=>array(
                        'asc'=>'address.city ASC',
                        'desc'=>'address.city DESC',
                    ),
                    'province_id'=>array(
                        'asc'=>'address.province_id ASC',
                        'desc'=>'address.province_id DESC',
                    ),
                )
            )
        ));
    }

В моем представлении у меня есть

$this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'applicants-grid',
        'dataProvider'=>$model->search(),
        'filter'=>$model,
        'columns'=>array(
            'first_name',
            'last_name',
            'phn',
            array(
                'name'=>'band_id',
                'value'=>'$data->band->name',
                'filter'=>CHtml::listData(Band::model()->findAll(), 'id', 'name')
            ),
            array(
                'name'=>'city',
                'value'=>'$data->address->city', // causes 'Trying to get property of non-object' - no error if $data->city
                'filter'=>CHtml::listData(Address::model()->findAll(), 'city', 'city'),
            ),
            array(
                'class'=>'CButtonColumn',
                'template'=>'{view}',
                'buttons'=>array(
                    'view'=>array(
                        'url'=>'Yii::app()->createUrl("/applicant/view", array("id"=>$data->id))',
                    )
                )
            ),
        )
    ));

У меня отображаются города и раскрывающийся список, но когда я выбираю город из раскрывающегося списка, он не фильтрует виджет с правильными результатами.

Я пытался выполнить решения на следующих страницах

http://www.yiiframework.com/forum/index.php?/topic/11546-cgridview-with-mulitple-model/ http://www.yiiframework.com/forum/index.php?/topic/19913-cgridview-with-multiple-models/

1 Ответ

0 голосов
/ 23 июля 2011

Вы ищете по первичному ключу таблицы городов в своем выражении сравнения?

Например, если PK города - "city_id", вам необходимо изменить строки ниже в вашей модели и виде соответственно:

$criteria->compare('address.city_id',$this->city);

'filter'=>CHtml::listData(Address::model()->findAll(), 'city_id', 'city')

(В этом примере вы бы оставили «город» в качестве имени, чтобы оно отображалось в виде текста в сетке, но укажите PK, city_id, в listData в атрибуте значения.)

...