【问题标题】:Yii2 Dynamically render GridViewYii2 动态渲染 GridView
【发布时间】:2015-12-03 19:03:17
【问题描述】:

我有一个表格/模型“研讨会”(培训)和一个表格/模型“类别”。 它们通过“seminar.category_id”字段连接,例如我可以使用研讨会->类别->名称。一切正常。

现在我想为每个类别呈现一个 GridView 小部件,其中包含相应的研讨会。

1) 我应该使用多个 GridView 还是有更好的方法 (我不需要过滤等)

2)如果1)的答案是肯定的GridView,我应该如何实现呢?

  1. 将代码放在一个小部件中并通过foreach调用
  2. 将代码放在视图中,通过foreach调用
  3. 将代码放在视图中,通过ListView调用
  4. ...

抱歉,问题很短,如有必要,我可以发布更多详细信息,但这更像是一个概念性问题。


更新 - 解决方案:

Hesam 的回答为我指明了正确的方向。由于我必须修改答案,我将在此处发布我的解决方案。

注意:我使用了 ActiveDataProvider

研讨会控制器/actionIndex:

$categories = Category::find()->where(['Status'=>Category::STATUS_ACTIVE])->All();
$dataProviders = [];

foreach ($categories as $category) {

        $dataProviders[] = new ActiveDataProvider([
            'query' => $category->getSeminars(),
        ]);
}

return $this->render('index', compact('dataProviders'));

努力让视图显示 - 不要使用:

<?php foreach(...){ $this->render()}... ?>

查看/研讨会/index.php:

<?php
foreach ($dataProviders as $dataProvider) {
?>
<?=
    $this->render('_categoryRow', [
        'dataProvider' => $dataProvider,
    ]);
?>
<?php } ?>

/view/seminar/_categoryRow.php:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
...

其他提示:

  1. 从$dataProvider获取当前类别名称(“name”是“category”的一列)

    $dataProvider->query->primaryModel->name

  2. 从 $dataProvider 获取当前的研讨会计数

    $dataProvider->getCount()

【问题讨论】:

    标签: gridview yii2 yii2-advanced-app


    【解决方案1】:

    一种方法是使用具有多个小部件的多个数据提供者。 考虑我们的操作中有这段代码:

        $categories = Category::find()->All();
        $dataProviders = [];
    
        foreach ($categories as $category) {
            $dataProviders[] = new ArrayDataProvider([
                'allModels' => $category->seminars,
                'sort' =>['attributes' => ['id'],], // Here you can choose your custom attributes for sorting
                'pagination' => ['pageSize' => 100]
            ]);
        }
    
        return $this->render('test', compact('dataProviders'));
    

    通过在视图中遍历$dataProviders 数组,我们可以显示所有类别及其子研讨会:

        foreach ($dataProviders as $dataProvider) {
    
        echo GridView::widget([
            'dataProvider' => $dataProvider,
    
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],
    
                'foo',
                'bar',
                'created_at:relativeTime',
                'updated_at:relativeTime',
            ],
    
        ]) ;
    
    }
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,它为我指明了正确的方向。我已经更新了答案以显示我的具体解决方案(我使用了 ActiveDataProvider 和子视图)
    • 很高兴帮助您找到合适的解决方案。使用子视图是一种更清晰的方式来完成这项工作,顺便说一下,Active Data Provider 将为您带来更多的数据维护能力。
    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多