Yii2动态渲染GridView

时间:2015-12-03 19:03:18

标签: gridview yii2 yii2-advanced-app

我有一个桌子/模型"研讨会" (培训)和表/模型"类别"。 它们通过字段" seminar.category_id"所以例如我可以使用研讨会 - > category->名称。一切正常。

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

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

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

  1. 将代码放入窗口小部件并通过foreach调用
  2. 将代码放在视图中并通过foreach调用
  3. 将代码放在视图中并通过ListView调用
  4. ...
  5. 很抱歉这个简短的问题,如果有必要,我可以发布更多细节,但这更像是一个概念问题。

    更新 - 解决方案:

    Hesa​​m的答案指出了我正确的方向。由于我必须修改答案,我将在此处发布我的解决方案。

    注意:我使用了ActiveDataProvider

    SeminarController /的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()}... ?>
    

    view / seminar / index.php:

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

    /view/seminar/_categoryRow.php:

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

    其他提示:

    1. 从$ dataProvider获取当前类别名称(&#34;名称&#34;是&#34;类别&#34的列;)

      $ dataProvider-&GT;查询 - &GT; primaryModel-&GT;名称

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

      $ dataProvider-&GT; getCount将()

1 个答案:

答案 0 :(得分:2)

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

    $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',
        ],

    ]) ;

}

希望它可以提供帮助。