Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
MarkL
Сообщения: 60
Зарегистрирован: 2017.07.05, 20:37

Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение MarkL »

Нужно выводить товар в таком формате:
Изображение

То есть, мы выводим товар в блоке группы, с которой он связан.

Имея дело с обычным массивом - это не было бы проблемой:

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

<?php foreach ($groups as $group): ?>
<div>
    <h1><?php echo $group['name'] ?></h1>
    <div>
        <table>
            <?php foreach ($group['products'] as $product): ?>
            <tr>
                <td><?php echo $product['name'] ?></td>
                <td><?php echo $product['price'] ?></td>
            </tr>
            <?php endforeach; ?>
        </table>
    </div>
</div>
<?php endforeach; ?>
Но нам нужна возможность фильтрации/сортировки, поэтому нужен ActiveDataProvider, данные которого оформляются с помощью ListView/GridView.

Из идей только костыли:

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

<?php foreach ($groups as $group): ?>
    <h1><?php echo $group['name'] ?></h1>
    <?php
        echo \yii\widgets\ListView::widget([
            'dataProvider' => new ActiveDataProvider([
                'query' => $group->products,
            ]),
            'layout' => "{items}",
            'itemView' => '@frontend/views/_parts/_order-search-item',
        ])
    ?>
<?php endforeach; ?>
Но он имеет кучу побочных эффектов, как минимум - лишние COUNT SQL-запросы. Как добиться нужного эффекта без костылей?
MarkL
Сообщения: 60
Зарегистрирован: 2017.07.05, 20:37

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение MarkL »

Может, просто отказаться от ActiveDataProvider или же GridView/ListView, при этом сохранив функционал фильтрации?
unknownby
Сообщения: 718
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение unknownby »

MarkL писал(а): 2022.05.24, 16:32 Может, просто отказаться от ActiveDataProvider или же GridView/ListView, при этом сохранив функционал фильтрации?
GridView - отображение моделей в виде списка.
ListView - отображение моделей со своим личным представлением.

Первый виджет больше для админ панели, а второй для пользовательского интерфейса.

Какая фильтрация вам нужна? В первом виджете фильтрация есть встроенная в виджете, во втором случае свою фильтрацию делаете.
MarkL
Сообщения: 60
Зарегистрирован: 2017.07.05, 20:37

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение MarkL »

unknownby писал(а): 2022.06.14, 11:34
MarkL писал(а): 2022.05.24, 16:32 Может, просто отказаться от ActiveDataProvider или же GridView/ListView, при этом сохранив функционал фильтрации?
GridView - отображение моделей в виде списка.
ListView - отображение моделей со своим личным представлением.

Первый виджет больше для админ панели, а второй для пользовательского интерфейса.

Какая фильтрация вам нужна? В первом виджете фильтрация есть встроенная в виджете, во втором случае свою фильтрацию делаете.
Как с помощью ListView сделать группировать записи по категориям, при этом выводя имя это категории?


Мне надо чтобы товар разделялся по категориям, при этом заголовок категорий выводить.

Чтобы было так:
Изображение

А не так:
Изображение
unknownby
Сообщения: 718
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение unknownby »

MarkL писал(а): 2022.06.30, 19:45 Как с помощью ListView сделать группировать записи по категориям, при этом выводя имя это категории?
Мне надо чтобы товар разделялся по категориям, при этом заголовок категорий выводить.
Чтобы было так:
Вы видимо не понимаете разницы между ListView и GridView.

ListView - выводит каждый раз представление в той форме, которую вы ему задали, т.е. вы можете нарисовать для одного товара один блок и если у вас 6 товаров, то выведет 6 красивых блоков.
GridView - выводит товары в виде списка, таблицы. В нем есть возможность группировки, которая скорее всего вам и нужна.

Попробуйте всё же использовать GridView, если задача ещё актуальна :D
MarkL
Сообщения: 60
Зарегистрирован: 2017.07.05, 20:37

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение MarkL »

unknownby, нет, Вы игнорируете полное прочтение сообщения и осмысление проблемы...
SiZE, спасибо, похоже на выход.
unknownby
Сообщения: 718
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как группирировать вывод записей при использовании ActiveDataProvider в Yii2?

Сообщение unknownby »

MarkL писал(а): 2022.07.28, 14:57 unknownby, нет, Вы игнорируете полное прочтение сообщения и осмысление проблемы...
SiZE, спасибо, похоже на выход.
Вам подошел ответ от SiZE, в котором он дал ссылку на свойство GridView.
Я посоветовал также использовать GridView.
Вам нужно внимательней быть ;)

P.S.
Чтоб не быть голословным.
Вот как сейчас у вас https://prnt.sc/j-qUxQBHpLXE
А вот так я предлагал вам сделать https://prnt.sc/lVtI3Ih7uKKa

В первом случае было

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

	      [
                'attribute' => 'menu_parent_id',
                'value' => function ($model) {
                    return $model->menuParent->menu_name;
                },
                'format' => 'raw',
                'filterType' => GridView::FILTER_SELECT2,
                'filter' => ArrayHelper::map(Menu::find()->all(), 'menu_id', 'menu_name'),
                'filterWidgetOptions' => [
                    'pluginOptions' => ['allowClear' => true],
                ],
                'filterInputOptions' => ['placeholder' => \Yii::t('main', 'Any')],
            ],
Вот корректировки под виджет GirdView от картика

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

            [
                'attribute' => 'menu_parent_id', 
                'width' => '310px',
                'value' => function ($model) {
                    return $model->menuParent->menu_name;
                },
                'format' => 'raw',
                'filterType' => GridView::FILTER_SELECT2,
                'filter' => ArrayHelper::map(Menu::find()->all(), 'menu_id', 'menu_name'),
                'filterWidgetOptions' => [
                    'pluginOptions' => ['allowClear' => true],
                ],
                'filterInputOptions' => ['placeholder' => 'Any supplier'],
                'group' => true,  // enable grouping,
                'groupedRow' => true,                    // move grouped column to a single grouped row
                'groupOddCssClass' => 'kv-grouped-row',  // configure odd group cell css class
                'groupEvenCssClass' => 'kv-grouped-row', // configure even group cell css class
            ],
Видимо вам проще написать сюда и тут ждать ответа.
Ответить