如何在 yii2 的 activeDataProvider 标题部分显示记录
How to show records in section with heading from activeDataProvider in yii2
我的数据库结构如下
id : item : name : price
1 : framework : bootstrap : 90
1 : framework : zend : 100
1 : framework : drupal : 150
1 : responsive : no : 0
1 : responsive : yes : 50
我想呈现结果,因为具有相同项目的行必须将该项目名称作为部分标题,其余数据应显示在该部分下
框架
Name : Price
Bootstrap : 90
Zend : 100
Drupal : 150
响应
Name : Price
None : 0
Yes : 50
我如何使用活动数据提供程序、数据小部件或可能有其他方法来完成此操作
我建议您覆盖 GridView 的 renderTableRow。如果您在要分组的列上检测到 value-change,只需插入一个自定义分组标题行即可。
<?php
class GroupGridView extends \yii\grid\GridView
{
public $groupingColumn = null;
public $groupingText = null;
public function renderTableRow ($model, $key, $index)
{
if ($this->groupingColumn == null)
return parent::renderTableRow($model, $key, $index);
$models = $this->dataProvider->models;
$result = '';
if ($index < count($models) - 1 && ($index == 0 || $models[$index][$this->groupingColumn] != $models[$index + 1][$this->groupingColumn])) {
$result = sprintf('<tr class="grouping"><td colspan="%d">%s</td></tr>', count($this->columns), ($this->groupingText == null ? $models[$index]->{$this->groupingColumn} : (is_callable($this->groupingText) ? call_user_func($this->groupingText, $model, $key, $index) : $this->groupingText)));
}
return $result . parent::renderTableRow($model, $key, $index);
}
}
$dataProvider = new \yii\data\ActiveDataProvider([
'query' => \common\models\Task::find()->orderBy(['customer_id' => SORT_ASC]),
'pagination' => [
'pageSize' => 100,
],
]);
echo GroupGridView::widget([
'groupingColumn' => 'item',
'groupingText' => function($model, $key, $index) {
return sprintf('--- %s --- %s --- %d', $model->item, $key, $index);
},
'dataProvider' => $dataProvider
])
?>
请记住,您必须按分组列排序。
我的数据库结构如下
id : item : name : price
1 : framework : bootstrap : 90
1 : framework : zend : 100
1 : framework : drupal : 150
1 : responsive : no : 0
1 : responsive : yes : 50
我想呈现结果,因为具有相同项目的行必须将该项目名称作为部分标题,其余数据应显示在该部分下
框架
Name : Price
Bootstrap : 90
Zend : 100
Drupal : 150
响应
Name : Price
None : 0
Yes : 50
我如何使用活动数据提供程序、数据小部件或可能有其他方法来完成此操作
我建议您覆盖 GridView 的 renderTableRow。如果您在要分组的列上检测到 value-change,只需插入一个自定义分组标题行即可。
<?php
class GroupGridView extends \yii\grid\GridView
{
public $groupingColumn = null;
public $groupingText = null;
public function renderTableRow ($model, $key, $index)
{
if ($this->groupingColumn == null)
return parent::renderTableRow($model, $key, $index);
$models = $this->dataProvider->models;
$result = '';
if ($index < count($models) - 1 && ($index == 0 || $models[$index][$this->groupingColumn] != $models[$index + 1][$this->groupingColumn])) {
$result = sprintf('<tr class="grouping"><td colspan="%d">%s</td></tr>', count($this->columns), ($this->groupingText == null ? $models[$index]->{$this->groupingColumn} : (is_callable($this->groupingText) ? call_user_func($this->groupingText, $model, $key, $index) : $this->groupingText)));
}
return $result . parent::renderTableRow($model, $key, $index);
}
}
$dataProvider = new \yii\data\ActiveDataProvider([
'query' => \common\models\Task::find()->orderBy(['customer_id' => SORT_ASC]),
'pagination' => [
'pageSize' => 100,
],
]);
echo GroupGridView::widget([
'groupingColumn' => 'item',
'groupingText' => function($model, $key, $index) {
return sprintf('--- %s --- %s --- %d', $model->item, $key, $index);
},
'dataProvider' => $dataProvider
])
?>
请记住,您必须按分组列排序。