在我的系统上,用户可以使用他们想要的名称创建列,因此我将列名保存到数据库中
我在列选项上使用此代码:
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
答案 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}] ;
},