Итоговая сумма в GridView
Итоговая сумма в GridView
Здравствуйте.
Использую виджет GridView заполняя различными числовыми данными из бд. Необходимо последним рядом в таблице отображать сумму по некоторым колонкам. Каким образом проще и гибче это сделать, в документации нашел метод renderTableFooter(), но для этого надо расширять класс GridView и переопределять этот метод. Можно ли сделать как-то гибче не расширяя класс виджета?
Использую виджет GridView заполняя различными числовыми данными из бд. Необходимо последним рядом в таблице отображать сумму по некоторым колонкам. Каким образом проще и гибче это сделать, в документации нашел метод renderTableFooter(), но для этого надо расширять класс GridView и переопределять этот метод. Можно ли сделать как-то гибче не расширяя класс виджета?
Re: Итоговая сумма в GridView
Создайте свой класс ячейки со счётчиком:
и выводите в гриде с включенным отображением футера:
Код: Выделить всё
namespace app\components;
use yii\grid\DataColumn;
class NumberColumn extends DataColumn
{
private $_total = 0;
public function getDataCellValue($model, $key, $index)
{
$value = parent::getDataCellValue($model, $key, $index);
$this->_total += $value;
return $value;
}
protected function renderFooterCellContent()
{
return $this->grid->formatter->format($this->_total, $this->format);;
}
}
Код: Выделить всё
<?= GridView::widget([
'dataProvider' => $dataProvider,
'showFooter' => true,
'columns' => [
'id',
[
'class' => NumberColumn::className(),
'attribute' => 'count',
],
],
]); ?>
Re: Итоговая сумма в GridView
Смысл понял, Дмитрий, но мне надо немного другое. Мне необходимо выводить итоговую сумму чисел по колонке последним рядом в таблице.
Например:
Там где вопросительные знаки, мне надо посчитать сумму по колонке.
Например:
Код: Выделить всё
100 500
200 700
300 800
100 500
Итого ? ?
Re: Итоговая сумма в GridView
Так это и есть.
Re: Итоговая сумма в GridView
Всем день добрый. Т.к. вопрос у меня полностью повторяет вопрос топикстартера, продолжу тему.
В коде виджета GridView нашёл штатный способ отображения итоговой строки и итоговой ячейки:
Этот код добавляет итоговую строку к таблице и выводит в ней значения, указанные в свойствах footer для каждой колонки.
А теперь вопрос(-ы):
В коде виджета GridView нашёл штатный способ отображения итоговой строки и итоговой ячейки:
Код: Выделить всё
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'account_name',
[
'attribute' => 'account_name',
'footer' => 'Всего:',
],
[
'attribute' => 'account_balance',
'footer' => '????',
],
],
'showFooter' => true,
]);
А теперь вопрос(-ы):
- Подскажите, пожалуйста, где правильнее было бы посчитать сумму по столбцу и как её передать в представление? (Я строю приложение на базе advanced шаблона yii2 и предполагаю, что сумму надо бы считать в searchModel)
- Делать ли это отдельным методом или сделать в уже существующем методе search просто перебором всех строк $dataProvider?
- Если перебирать $dataProvider, то какое свойство ему добавить, чтобы потом прочитать в представлении? Может существуют какие-либо штатные (типа $dataProvider->{columnName}->footer)?
Re: Итоговая сумма в GridView
А мой ответ топикстартеру полностю повторяет ответ Вам.Паяц писал(а):Т.к. вопрос у меня полностью повторяет вопрос топикстартера, продолжу тему.
Re: Итоговая сумма в GridView
- В Вашем примере итоговая ячейка выводится в отдельном виджете или в том же, где выводится основная таблица?
- Зачем Вы генерируете целую ячейку, если в GridView уже есть функционал по выводу футера (и задача сводится фактически к работе только со значением в ячейке футера - вычислению суммы, передачи её в представление и отображению)?
Мой вышеприведённый пример я доделал до следующего состояния:
Код: Выделить всё
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'account_name',
[
'attribute' => 'account_name',
'footer' => 'Всего:',
],
[
'attribute' => 'account_balance',
'footer' => \frontend\models\AccountSearch::getTotalBalance($dataProvider->models, 'account_balance'),
],
],
'showFooter' => true,
]);
Код: Выделить всё
public static function getTotalBalance($dataProvider, $fieldName){
$totalBalance = 0;
foreach ($dataProvider as $item){
$totalBalance += $item[$fieldName];
}
return $totalBalance;
}
Re: Итоговая сумма в GridView
Похоже, что в стандартном функционале нет форматирования ячейки футера, т.е. привести её к тому же формату, что и значения в колонке, не получится. Это так или я чего-то не заметил?
Re: Итоговая сумма в GridView
Попробовал сделать по предложенному ElisDN варианту - получилось красивее
Теперь функционал отображения суммы можно использовать в любой таблице (я создал отдельный файл и поместил его в common\models.
Отвечу на свои вопросы:
Теперь функционал отображения суммы можно использовать в любой таблице (я создал отдельный файл и поместил его в common\models.
Отвечу на свои вопросы:
- Да, данные отображаются в той же таблице виджета
- Свою ячейку надо бы делать в том числе для распространения форматирования колонки на итоговую ячейку - хотя мне кажется, что это недоработка фреймворка - вся колонка должна быть в едином формате (а сейчас формат на итоговую ячейку не распространяется)
Re: Итоговая сумма в GridView
господа, пардон, конечно, за некротоп, но что тут отлично работает? Как я понимаю задача была вывести итоговую СТРОКУ, а предложенный код выводит итоговый СТОЛБЕЦ
Re: Итоговая сумма в GridView
Вы видимо отдельной колонкой добавили класс, а вам необходимо указать класс у уже имеющейся колонки, тогда появится итоговая строка.
Обязательно с указанием параметра 'showFooter' => true,