如何知道yii2 Gridview上的列名

时间:2016-10-23 19:29:09

标签: php gridview yii2

在我的系统上,用户可以使用他们想要的名称创建列,因此我将列名保存到数据库中

我在列选项上使用此代码:

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,
]); ?>

我想使用该值,因为如果$ item-&gt;类型为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
        )

)

由于我使用动态列,因此我无法对列名称进行硬编码,例如$ mode-&gt; IMAGE_1

2 个答案:

答案 0 :(得分:1)

正如你所说,$item超出了范围,并且如php doc about anonymous functions所述(不是yii特有的):

  

闭包还可以从父作用域继承变量。任何此类变量都必须传递给use语言构造。

您只需添加use ($item)

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

PS:这个问题应该关闭,因为它是重复的

答案 1 :(得分:0)

可以使用dinamic变量名

来访问该值
    return $model->{$item->name};

或使用数组访问

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