Итоговая сумма в GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Pulse
Сообщения: 32
Зарегистрирован: 2014.05.15, 14:33

Итоговая сумма в GridView

Сообщение Pulse »

Здравствуйте.
Использую виджет GridView заполняя различными числовыми данными из бд. Необходимо последним рядом в таблице отображать сумму по некоторым колонкам. Каким образом проще и гибче это сделать, в документации нашел метод renderTableFooter(), но для этого надо расширять класс GridView и переопределять этот метод. Можно ли сделать как-то гибче не расширяя класс виджета?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Итоговая сумма в GridView

Сообщение ElisDN »

Создайте свой класс ячейки со счётчиком:

Код: Выделить всё

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',
        ],
    ],
]); ?>
Аватара пользователя
Pulse
Сообщения: 32
Зарегистрирован: 2014.05.15, 14:33

Re: Итоговая сумма в GridView

Сообщение Pulse »

Смысл понял, Дмитрий, но мне надо немного другое. Мне необходимо выводить итоговую сумму чисел по колонке последним рядом в таблице.
Например:

Код: Выделить всё

                    100   500   
                    200   700
                    300   800
                    100   500
Итого                ?     ?
Там где вопросительные знаки, мне надо посчитать сумму по колонке.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Итоговая сумма в GridView

Сообщение ElisDN »

Так это и есть.
Паяц
Сообщения: 40
Зарегистрирован: 2012.05.22, 20:09
Откуда: Москва, Россия

Re: Итоговая сумма в GridView

Сообщение Паяц »

Всем день добрый. Т.к. вопрос у меня полностью повторяет вопрос топикстартера, продолжу тему.
В коде виджета GridView нашёл штатный способ отображения итоговой строки и итоговой ячейки:

Код: Выделить всё

    GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            'account_name',
            [
                'attribute' => 'account_name',
                'footer' => 'Всего:',
            ],
            [
                'attribute' => 'account_balance',
                'footer' => '????',
            ],
        ],
        'showFooter' => true,
    ]); 
Этот код добавляет итоговую строку к таблице и выводит в ней значения, указанные в свойствах footer для каждой колонки.

А теперь вопрос(-ы):
  1. Подскажите, пожалуйста, где правильнее было бы посчитать сумму по столбцу и как её передать в представление? (Я строю приложение на базе advanced шаблона yii2 и предполагаю, что сумму надо бы считать в searchModel)
  2. Делать ли это отдельным методом или сделать в уже существующем методе search просто перебором всех строк $dataProvider?
  3. Если перебирать $dataProvider, то какое свойство ему добавить, чтобы потом прочитать в представлении? Может существуют какие-либо штатные (типа $dataProvider->{columnName}->footer)?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Итоговая сумма в GridView

Сообщение ElisDN »

Паяц писал(а):Т.к. вопрос у меня полностью повторяет вопрос топикстартера, продолжу тему.
А мой ответ топикстартеру полностю повторяет ответ Вам.
Паяц
Сообщения: 40
Зарегистрирован: 2012.05.22, 20:09
Откуда: Москва, Россия

Re: Итоговая сумма в GridView

Сообщение Паяц »

  1. В Вашем примере итоговая ячейка выводится в отдельном виджете или в том же, где выводится основная таблица?
  2. Зачем Вы генерируете целую ячейку, если в GridView уже есть функционал по выводу футера (и задача сводится фактически к работе только со значением в ячейке футера - вычислению суммы, передачи её в представление и отображению)?
Пока нашёл ещё одно решение в теме: Re: GridView Yii2.

Мой вышеприведённый пример я доделал до следующего состояния:

Код: Выделить всё

    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,
    ]);
А в файл модели AccountSearch добавил функцию

Код: Выделить всё

    public static function getTotalBalance($dataProvider, $fieldName){
        $totalBalance = 0;

        foreach ($dataProvider as $item){
            $totalBalance += $item[$fieldName];
        }
        
        return $totalBalance;
    }
Но меня терзают смутные сомнения - не очень красиво выглядит решение... Наверняка уже есть какой-то механизм доступа к методам модели без прямого обращения к классу...
Паяц
Сообщения: 40
Зарегистрирован: 2012.05.22, 20:09
Откуда: Москва, Россия

Re: Итоговая сумма в GridView

Сообщение Паяц »

Похоже, что в стандартном функционале нет форматирования ячейки футера, т.е. привести её к тому же формату, что и значения в колонке, не получится. Это так или я чего-то не заметил?
Паяц
Сообщения: 40
Зарегистрирован: 2012.05.22, 20:09
Откуда: Москва, Россия

Re: Итоговая сумма в GridView

Сообщение Паяц »

Попробовал сделать по предложенному ElisDN варианту - получилось красивее :)

Теперь функционал отображения суммы можно использовать в любой таблице (я создал отдельный файл и поместил его в common\models.

Отвечу на свои вопросы:
  1. Да, данные отображаются в той же таблице виджета
  2. Свою ячейку надо бы делать в том числе для распространения форматирования колонки на итоговую ячейку - хотя мне кажется, что это недоработка фреймворка - вся колонка должна быть в едином формате (а сейчас формат на итоговую ячейку не распространяется)
oughtem2
Сообщения: 34
Зарегистрирован: 2019.10.26, 20:50

Re: Итоговая сумма в GridView

Сообщение oughtem2 »

господа, пардон, конечно, за некротоп, но что тут отлично работает? Как я понимаю задача была вывести итоговую СТРОКУ, а предложенный код выводит итоговый СТОЛБЕЦ
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Итоговая сумма в GridView

Сообщение Alexum »

oughtem2 писал(а): 2019.12.07, 17:00 Как я понимаю задача была вывести итоговую СТРОКУ, а предложенный код выводит итоговый СТОЛБЕЦ
Нет никакого итогового столбца, сумма выводится в строке для футера.
scarj
Сообщения: 4
Зарегистрирован: 2017.11.01, 11:47

Re: Итоговая сумма в GridView

Сообщение scarj »

oughtem2 писал(а): 2019.12.07, 17:00 господа, пардон, конечно, за некротоп, но что тут отлично работает? Как я понимаю задача была вывести итоговую СТРОКУ, а предложенный код выводит итоговый СТОЛБЕЦ
Вы видимо отдельной колонкой добавили класс, а вам необходимо указать класс у уже имеющейся колонки, тогда появится итоговая строка.
Обязательно с указанием параметра 'showFooter' => true,
Ответить