在表格样式中显示关联数组的最简单方法是什么?
数组定义为
$data = [ 'name' => 'bert', 'age' => 42 ];
不需要输入验证。输出应该看起来像GridView(每行一个键/值),但GridView需要一个模型。
所以我可以使用DynamicModel,ArrayDataProvider或其他Yii2的东西。
我尝试了很多,但应该有一个简单的方法来完成这项工作。
答案 0 :(得分:1)
你可以这样做并使用DetailView的功能,尤其是格式化。我稍微增强了你的数据。只需将代码复制到视图文件中即可获得快速印象。
$myArray = [
'name' => 'bert',
'age' => 42,
'My email address' => 'my-email@example.com', //no problems with spaces in the key
'html' => '<div style="font-size: 2em">asdf</div>',
];
echo \yii\widgets\DetailView::widget([
'model' => $myArray,
'attributes' => [
'name',
'age',
'My email address:email',
'html',
'html:html',
'html:html:Html with different label',
[
'label' => 'Html self defined',
'attribute' => 'html', // key in model
'format' => 'raw'
]
]
])
属性是指模型的键。
查看here如何使用属性。
即。如果您不了解内容并获取不同类型的数据,则可以使用DetailView默认格式(格式为&#39; text&#39;)。最简单的方式是:
echo \yii\widgets\DetailView::widget([
'model' => $myArray,
'attributes' => array_keys($myArray),
]);
如果您想要或多或少地控制格式,请使用格式&#39; raw&#39;:
echo \yii\widgets\DetailView::widget([
'model' => $myArray,
'attributes' => array_map(function ($key) {
return "$key:raw";
// or build some logic for the right format
// e.g. use '$key:email' if key contains 'email'
}, array_keys($myArray)),
]);
关于本地化标签的答案中的要求,您可以这样做(使用默认的&#39;文字&#39;格式):
echo \yii\widgets\DetailView::widget([
'model' => $myArray,
'attributes' => array_map(function ($key) {
return $key . ':text:' . Yii::t('app', 'label-' . $key);
}, array_keys($myArray)),
]);
但是,请注意,如果'label-' . $key
不存在,则可能需要进一步的逻辑。否则 label-somekey 将显示在DetailView中。
答案 1 :(得分:0)
找到一个解决方案,甚至可以使用正在翻译的属性标签,但它是“最简单的”吗?
在控制器文件中:
class MyDynModel extends \yii\base\DynamicModel {
public function generateAttributeLabel($name) {
return Yii::t('app','label-'.$name);
}
}
class MyController extends Controller {
public function actionShow() {
$data = [ 'name' => 'bert', 'age' => 42 ];
$dataModel = new MyDynModel($data);
return $this->render('myview', ['dataModel'=>$dataModel]);
}
}
在视图文件“my / myview.php”中:
echo \yii\widgets\DetailView::widget(['model'=>$dataModel]);
在翻译文件“messages / en / app.php”中:
return [
'label-name' => 'Name',
'label-age' => 'Age (in Years)',
];