Yii CGridView, отображающий несколько столбцов из связанной модели с возможностью фильтрации

Я новичок в yii и столкнулся со следующей проблемой. У меня есть две связанные таблицы, ClientTicket и Product со следующей структурой:

Клиентский билет

  • id
  • ticket_name
  • ID клиента
  • идантификационный номер продукта

Продукт

  • id
  • тип
  • модель
  • марка

Две таблицы связаны внешним ключом, который связывает ClientTicket.product_id с Product.id.

Проблема

В административном представлении ClientTicket мне удалось включить два столбца продукта (марка, модель) и отобразить окно поиска для каждого из них, но фильтрация не работает должным образом. Пример: когда я ищу в одном из двух полей поиска (марка, модель), другое автоматически заполняется тем же значением, которое я ввел (поэтому нет результатов поиска).

Модель ClientTicket:

    public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'product' => array(self::BELONGS_TO, 'Product', 'product_id'),
        ........
    );
}

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

    $criteria=new CDbCriteria;

    ...
    $criteria->compare('product.model',$this->product_id, true);
    $criteria->compare('product.brand',$this->product_id, true);
    ...

    $criteria->with=array(..., 'product',);
    $criteria->together= true;

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'pagination' => array('pageSize' => 10),
    ));
}

Файл представления ClientTicket Admin:

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'client-ticket-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'ticket_number',
    'ticket_date',
    array('name'=>'agent_id',
        'header'=> 'Agent',
        'value'=> '$data->ticket_agent->name',
        'filter'=>CHtml::listData(Agent::model()->findAll(), 'name', 'name'),
        ),
    ...
    array('name'=>'product_id',
        'header'=> 'Product',
        'value'=> '$data->product->model',
        ),
    array('name'=>'product_id',
        'header'=> 'Brand',
        'value'=>'$data->product->brand'
        ),

person Raven_ 007    schedule 23.10.2013    source источник


Ответы (2)


Ваши столбцы product и brand имеют одинаковые name, но разные values. Фильтр получает имя поля из name, если вы явно не укажете его, т.е. создадите свое собственное активное поле. Кроме того, вы используете один и тот же атрибут product_id для поиска по обоим полям в вашей функции search.

Как фильтровать с использованием связанных моделей, был дан ответ в Yii - как я могу искать по столбцу из внешнего/родственного ключа на странице администратора?

person topher    schedule 23.10.2013
comment
как @Raven_ 007 изменить массив? - person Developerium; 23.10.2013

Для справки других пользователей, вот как я заставил это работать. Еще раз спасибо, topher, за быстрый ответ. :)

Внутри модели ClientTicket:

  • объявил новую общедоступную переменную с именем $brand
  • добавлено 'бренд' в 'безопасный' 'on'=>'поиск' массив внутри функции rules()
  • добавлен новый критерий внутри функции search(), например:
    $criteria->compare('product.brand',$this->brand , верно);

В файле представления администратора ClientTicket:

изменил столбец бренда продукта из этого:

array('name'=>'product_id',
    'header'=> 'Brand',
    'value'=>'$data->product->brand'
    ),

к этому:

 array('name'=>'product.brand',
    'header'=> 'Brand',
    'filter'=>CHtml::activeTextField($model,'brand'),
    ),
person Raven_ 007    schedule 23.10.2013