Php 如何知道yii2 Gridview上的列名

Php 如何知道yii2 Gridview上的列名,php,gridview,yii2,Php,Gridview,Yii2,在我的系统上,用户可以用他们想要的名称创建列,所以我将列名保存到数据库中 我在列选项上使用此代码: foreach((new Field)->listFields as $item){ data = [ 'attribute' => $item->name, 'value' => function($model){ return $model->$item->name; // the problem is here, $i

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

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

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,
]); ?>
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->IMAGE_1那样硬编码列名,因为您可以使用dinamic变量名访问该值

    return $model->{$item->name};
或者使用数组访问

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

可以使用dinamic变量名访问该值

    return $model->{$item->name};
或者使用数组访问

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

正如您所说,
$item
超出了范围,正如php文档中所说的(并非特定于yii):

闭包也可以从父范围继承变量。任何此类变量都必须传递给
use
语言结构

您只需添加
使用($item)


PS:这个问题应该结束,因为它是一个重复的

,正如你所说,
$item
超出了范围,正如php文档中所说的(不特定于yii):

闭包也可以从父范围继承变量。任何此类变量都必须传递给
use
语言结构

您只需添加
使用($item)


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

请显示您的模型(字段)和所有操作代码为什么在$this->render中有$model?要像表单一样传递此gridview中未使用的其他变量,请显示您的模型(字段)还有所有的动作代码为什么在$this->render中有$model?来传递这个gridview中没有使用的其他变量,就像表单一样。你说得对,谢谢!你说得对,谢谢!