【问题标题】:Yii2: display associative arrayYii2:显示关联数组
【发布时间】:2017-12-01 00:36:39
【问题描述】:

以表格样式显示关联数组的最简单方法是什么?

数组定义为

$data = [ 'name' => 'bert', 'age' => 42 ];

不需要输入验证。输出应该看起来像 GridView(每行一个键/值),但 GridView 需要一个模型。

所以我可以使用 DynamicModel、ArrayDataProvider 或其他 Yii2 的东西。

我尝试了很多,但应该有一个简单的方法来完成这项工作。

【问题讨论】:

    标签: php arrays gridview yii2 output


    【解决方案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 默认格式(即格式为'text')。最简单的方式是:

    echo \yii\widgets\DetailView::widget([
        'model'      => $myArray,
        'attributes' => array_keys($myArray),
    ]);
    

    如果你想或多或少控制格式,使用可能要使用这个,使用格式'raw':

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

    关于您回答中本地化标签的要求,您可以这样做(使用默认的“文本”格式):

    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 中。

    【讨论】:

    • 这不是我的问题的真正解决方案,因为要显示的属性必须在 DetailView 中明确指定。我需要在视图中显示数组中任意数量的键/值。
    • @WeSee 更新了我的答案。
    • 谢谢。这导致正确的方向。在我的解决方案中,也处理了标签。如何在您的解决方案中做到这一点?
    • @WeSee 他们应该/应该以何种方式处理?
    • 请看我的解决方案。每个数组都应该有一个文本标签“label-key”,可以由 Yii::t(...) 处理
    【解决方案2】:

    找到了一个解决方案,它甚至可以处理正在翻译的属性标签,但它是“最简单的”吗?

    在控制器文件中:

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

    【讨论】:

    • 恕我直言,制作一个定义标签的回调函数会很好。这将避免继承 DynamicModel。
    • 将 ArrayDataProvider 与 gridview 结合使用将是一种简单易行的方法。
    • 好的,但是 DetailView 需要一个模型作为数据源 AFAIK。如何将这些结合在一起?
    猜你喜欢
    • 2018-10-14
    • 2015-03-31
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-10-13
    • 2018-10-14
    • 2016-11-12
    相关资源
    最近更新 更多