2016-10-23 67 views
0

在我的系統,用戶可以創建自己想要的名字列,所以我保存列名到數據庫如何知道列名上yii2的GridView

我使用的列選項驗證碼:

foreach((new Field)->listFields as $item){ 

    data = [ 
    'attribute' => $item->name, 
    'value' => function($model){ 
     return $model->$item->name; // the problem is here, $item->name is out of the scope 
    }, 
    ]; 
    array_push($columns, $data); 
} 

return $this->render('index', [ 
    'model' => $model, 
    'dataProvider' => $dataProvider, 
    'columns' => $columns, 
]); 

這是我的索引視圖:

<?= \yii\grid\GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'formatter' => ['class' => 'yii\i18n\Formatter'], 
    'columns' => $columns, 
]); ?> 

我想使用的價值,因爲我想對數據進行格式化,如果$用品 - >類型是X或Y 例如:

'value' => function($model){ 
    if($item->type == 'img'){ 
     return Html::img($model->$item->name), 
    else { 
     return $model->$item->name; 
    } 
}, 

的listField的返回僅僅是一個數組:

Array 
(
    [0] => stdClass Object 
     (
      [name] => ITEM_1 
      [type] => txt 
     ) 

    [1] => stdClass Object 
     (
      [name] => IMAGE_1 
      [id] => img 
     ) 

    [2] => stdClass Object 
     (
      [name] => IMAGE_2 
      [id] => img 
     ) 
) 

和在dataProvider中SQL的返回

Array 
(
    [0] => Array 
     (
      [ITEM_1] => Item 1 blablabla 
      [IMAGE_1] => http://url.jpg 
      [IMAGE_2] => http://url2.jpg 
      [id] => 1 
     ) 

) 

正如我使用動態列,我不能t硬編碼列名像$ mode-> IMAGE_1

+0

請出示你的模型(場)和所有的動作代碼 – scaisEdge

+0

爲什麼你$ this->渲染中的$模型? – scaisEdge

+0

可以像表單一樣傳遞此GridView中未使用的其他變量。 – ricardo

回答

1

至於你說,$item超出範圍,並且在PHP DOC about anonymous functions(不特定於YII)作爲所述:

閉包也可能繼承父範圍的變量。任何這樣的變量都必須傳遞給use語言結構。

你應該簡單地添加use ($item)

'value' => function($model) use ($item) { 
    return $model->{$item->name}; 
}, 

PS:這個問題應該被關閉,因爲它是一個重複的

+0

你是對的,謝謝! – ricardo

0

可能是您可以訪問使用動態變量名稱的值

return $model->{$item->name}; 

或使用陣列存取

'value' => function($data){ 
    return $data[{$item->name}] ; 
    },