2015-08-13 2 views
2

Я пытаюсь иметь GridView с одним столбцом в типе ссылок URL. Этот столбец связан с отношением в модели Region (как region_type - FK), в частности, атрибутом имени этой связанной таблицы. В этом GridView у меня не возникло проблем, чтобы получить значение имени этой связанной таблицы, но проблема заключается в том, чтобы предоставить им формат ссылки вместо простого имени. Я установил parentRegion.name как атрибут отношения в модели RegionSearch.YII2 Данные столбца GridView как ссылка на связанный атрибут таблицы

Просмотр:

<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      [ 
       'label' => 'View parent', 
       'format' => 'raw', 
       // here comes the problem - instead of parent_region I need to have parent 
       'value' => function ($dataProvider) { 
        return Html::a('view', '/admin/region/view?id=' . $dataProvider->parent_region); 
       }, 
      ], 

      'parentRegion.name', // this is what I want to display in link value - name of this related data 


      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 

RegionSearch:

public function attributes() 
{ 
      // add related fields to searchable attributes 
      return array_merge(parent::attributes(), ['parentRegion', 'regionType']); 
} 

public function search($params) 
{ 
    $query = Region::find(); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    $query->joinWith(['parentRegion' => function($query) { $query->from(['parentRegion' => 'region']); }]); 
    $dataProvider->sort->attributes['parentRegion'] = [ 
     'asc' => ['parentRegion' => SORT_ASC], 
     'desc' => ['parentRegion' => SORT_DESC], 
    ]; 

    $this->load($params); 

    if (!$this->validate()) { 
     // uncomment the following line if you do not want to return any records when validation fails 
     // $query->where('0=1'); 
     return $dataProvider; 
    } 

    $query->andFilterWhere(['like', 'name', $this->name]) 
     ->andFilterWhere(['like', 'parentRegion', $this->getAttribute('parentRegion')]) 

    return $dataProvider; 
} 

Не могли бы вы помочь мне, как получить это имя свойства (атрибута из связанной таблицы) этой GridView как ссылку?

ответ

3

Попробуйте это ..

[ 
      'label' => 'Name', 
      'format' => 'raw', 
      'value' => function ($data) { 
         return Html::a($data->parentRegion->name, ['/admin/region/view', 'id' => $data->parent_id]); 
        }, 
    ], 
+0

Не работает, я получаю это исключение: Пытаюсь получить свойство не-объекта – kennySystemExit

+0

ссылка появится в GridView? – GAMITG

+0

Нет, я думаю, это потому, что $ dataProvider не имеет свойства parentRegion. Это свойство можно получить из класса модели, но не из $ dataProvider. Проблема заключается в том, чтобы иметь это свойство в $ dataProvider. – kennySystemExit