Yii CGridview - поиск / сортировка работает, но значения не отображаются в соответствующих ячейках - PullRequest
1 голос
/ 14 января 2012

Я немного расстроен этой проблемой Yii CGridView, и любая помощь или руководство будут высоко оценены.

У меня есть две связанные таблицы с магазинами (shop_id primary) и контактами (shop_id Foreign), так что в одном магазине может быть несколько контактов. Я использую CGridview для извлечения записей и сортировки, и моя функция отношения в модели магазинов выглядит примерно так:

  'shopscontact' => array(self::HAS_MANY, 'Shopsmodel', 'shop_id');

В сетке магазина мне нужно отобразить строку магазина с любым из доступных контактов. Моя попытка фильтрации, поиска в Grid работала довольно хорошо, но я застрял в одной очень странной проблеме. В соответствующем столбце сетки не отображается предполагаемое значение.

В файле CGridview я делаю что-то вроде

  array(
    'name' => 'shopscontact.contact_firstname',
    'header' => 'First Name',        
    'value' => '$data->shopscontact->contact_firstname'
    ),

для отображения имени контакта. Однако даже при обстоятельствах, когда поиск / сортировка работают (я узнал, проверив связи БД), столбец сетки выходит пустым! :( А когда я делаю var_dump

 array(
    'name' => 'shopscontact.contact_firstname',
    'header' => 'First Name',
    'value' => 'var_dump($data->shopscontact)'
    ),

Дамп отображает значения записей в атрибутах _private следующим образом:

  private '_attributes' (CActiveRecord) => 
    array
      'contact_firstname' => string 'rec1' (length=4)
      'contact_lastname' => string 'rec1 lsname' (length=11)
      'contact_id' => string '1' (length=1)

<Редактировать:>

Мой код критерия в модели:

  $criteria->with = array(
    'owner', 
    'states', 
    'shopscontacts' => array(
      'alias' => 'shopscontacts',
      'select' => 'shopscontacts.contact_firstname,shopscontacts.contact_lastname',
      'together' => true
    )
  );

Как получить доступ к значениям в соответствующих столбцах? Пожалуйста помоги! :(

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Хм, я не очень много использовал методы with () и Together ().Интересно то, что в части 'value' столбца $data->shopscontacts загружает новое отношение, основываясь на определении relations() (а не на объявленном вами criteria).

Более чистый способ обработки вывода массива может быть таким:

'value' => 'array_shift($data->shopscontacts)->contact_lastname'

Возможно, лучший способ сделать это , однако, это установить новое (дополнительное) отношение,например, в вашей shops модели:

public function relations()
{
  return array(
    'shopscontacts' => array(self::HAS_MANY, 'Shopsmodel', 'shop_id'), // original
    'firstShopscontact' => array(self::HAS_ONE, 'Shopsmodel', 'shop_id'), // the new relation
  );
}

Затем в CGridView вы можете просто настроить столбец следующим образом:

'columns'=>array(
  'firstShopscontact.contact_lastname',
),

Cheers

2 голосов
/ 14 января 2012

Поскольку 'shopscontact' - это имя отношения has-many, $data->shopscontact должен возвращать массив со всеми магазинами, связанными ... Вы изменили отношение, чтобы вернуть только одну запись (если я не не так, вам нужно только показать один, верно?)? Если вы это сделали, могу я увидеть ваш код фильтрации?

P.S. Предчувствие быстрого, но временного решения: вы пробовали 'value' => '$data->shopscontact['contact_firstname']'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...