Yii2 动态渲染 GridView
Yii2 Dynamically render GridView
我有一个 table/model "seminar"(培训)和一个 table/model "category"。
它们通过 "seminar.category_id" 字段连接,例如我可以使用 seminar->category->name。一切正常。
现在我想为每个类别呈现一个 GridView 小部件,其中包含相应的研讨会。
1) 我应该使用多个 GridView 还是有更好的方法
(我不需要过滤等)
2)如果1)的回答是GridView,我该如何实现?
- 将代码放在一个widget中,通过foreach调用
- 将代码放在视图中并通过foreach调用
- 将代码放在视图中,通过ListView调用
- ...
抱歉这个简短的问题,如有必要,我可以 post 更多细节,但它更像是一个概念性问题。
更新 - 解决方案:
Hesam 的回答为我指明了正确的方向。由于我必须修改答案,因此我将 post 我的解决方案放在这里。
注意:我用的是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,
...
补充提示:
从$dataProvider获取当前分类名称("name"是"category"的一列)
$dataProvider->query->primaryModel->name
正在从 $dataProvider 获取当前的研讨会数量
$dataProvider->getCount()
一种方法是使用具有多个小部件的多个数据提供者。
考虑到我们的操作中有这段代码:
$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',
],
]) ;
}
希望对您有所帮助。
我有一个 table/model "seminar"(培训)和一个 table/model "category"。 它们通过 "seminar.category_id" 字段连接,例如我可以使用 seminar->category->name。一切正常。
现在我想为每个类别呈现一个 GridView 小部件,其中包含相应的研讨会。
1) 我应该使用多个 GridView 还是有更好的方法 (我不需要过滤等)
2)如果1)的回答是GridView,我该如何实现?
- 将代码放在一个widget中,通过foreach调用
- 将代码放在视图中并通过foreach调用
- 将代码放在视图中,通过ListView调用
- ...
抱歉这个简短的问题,如有必要,我可以 post 更多细节,但它更像是一个概念性问题。
更新 - 解决方案:
Hesam 的回答为我指明了正确的方向。由于我必须修改答案,因此我将 post 我的解决方案放在这里。
注意:我用的是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,
...
补充提示:
从$dataProvider获取当前分类名称("name"是"category"的一列)
$dataProvider->query->primaryModel->name
正在从 $dataProvider 获取当前的研讨会数量
$dataProvider->getCount()
一种方法是使用具有多个小部件的多个数据提供者。 考虑到我们的操作中有这段代码:
$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',
],
]) ;
}
希望对您有所帮助。