Плоское меню из категорий товаров

Возникла задачка: выбрать все категории товаров и вывести их списком в одном месте. Этакое "плоское меню". 6 блоков, по 2 категории в каждом, итого 12 небольших меню. При этом, конечно, категории товаров находятся на разной глубине, и даже вложены друг в друга.

Ни один стандартный сниппет так не сделает, поэтому пришлось написать свой.


<?php
if (!isset($group)) {$group = 2;} // Сколько меню в одном блоке
if (!isset($cat_limit)) {$cat_limit = 12;} // Сколько выбирать категорий
if (!isset($product_limit)) {$product_limit = 5;} // Сколько выбирать категорий
if (!isset($cat_sort)) {$cat_sort = 'RAND()';} // Сортировка категорий
if (!isset($product_sort)) {$product_sort = 'RAND()';} // Сортировка товаров
if (!isset($showEmptyCat)) {$showEmptyCat = 1;} // Выводить ли пустые категории
if (!isset($showUnpublished)) {$showUnpublished = 0;} // Выводить неопубликованные
if (!isset($showDeleted)) {$showDeleted = 0;} // Выводить удаленные
if (empty($tplOuter)) {$tplOuter = '@INLINE <div class="span2">[[+menus]]</div>';} // Чанк-обертка блока с несколькими меню
if (empty($tplMenu)) {$tplMenu = '@INLINE <ul class="unstyled">[[+rows]]</ul>';} // Чанк для одного меню
if (empty($tplCat)) {$tplCat = '@INLINE <li class="footer-title"><a href="/[[+uri]]">[[+pagetitle]]</a></li>';} // Чанк категории
if (empty($tplRow)) {$tplRow = '@INLINE <li><a href="/[[+uri]]">[[+pagetitle]]</a></li>';} // Чанк товара
if (empty($tplCatActive)) {$tplCatActive = '@INLINE <li class="footer-title"><span>[[+pagetitle]]</span></li>';} // Текущая категория
if (empty($tplRowActive)) {$tplRowActive = '@INLINE <li><span>[[+pagetitle]]</span></li>';} // Текущий товар
//---
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig($scriptProperties);

$cats = $pdo->getCollection('modResource', array('class_key' => 'msCategory'), array(
    'limit' => $cat_limit,
    'showUnpublished' => $showUnpublished,
    'showDeleted' => $showDeleted,
    'sortby' => $cat_sort,
));
if (empty($cats)) {return '';}

$i = 0;
$menus = $output = '';
foreach ($cats as $cat) {
    $children = $pdo->getCollection('modResource', array('class_key' => 'msProduct', 'parent' => $cat['id']), array(
        'limit' => $product_limit,
        'showUnpublished' => $showUnpublished,
        'showDeleted' => $showDeleted,
        'sortby' => $product_sort,
    ));
    
    if (empty($children) && empty($showEmptyCat)) {
        continue;
    }

    $rows = $cat['id'] == $modx->resource->id
        ? $pdo->getChunk($tplCatActive, $cat)
        : $pdo->getChunk($tplCat, $cat);
        
    if (!empty($children)) {
        foreach ($children as $row) {
            $rows .= $row['id'] == $modx->resource->id
                ? $pdo->getChunk($tplRowActive, $row)
                : $pdo->getChunk($tplRow, $row);
        }
    }
    
    $menus .= $pdo->getChunk($tplMenu, array('rows' => $rows));
    
    if ($i % $group) {
        $output .= $pdo->getChunk($tplOuter, array('menus' => $menus));
        $menus = '';
    }
    $i++;
}

return $output;

Сниппет выбирает 12 категорий и по 5 товаров к ним. Затем собирает все в кучу, оформляет и выводит. Всего выходит не больше 13 запросов в БД.

Вот, что получилось на реальном проекте:

Возможно, кому-то еще пригодится.

← Предыдущая заметка
Вывод ТВ со своим оформлением
Следующая заметка →
Вывод категорий с присоединением товара
Комментарии (0)
born2slip
pishnaa istntome
22.11.2022 14:06
огромное спасибо! )
inetlover
Александр Наумов
14.11.2022 10:19
посмотри документацию. Спасибо, что-то она мне не нагуглилась. Это просто функции объединения для о...
bezumkin
Василий Наумкин
10.11.2022 05:46
Спасибо за поздравления!
inetlover
Александр Наумов
09.11.2022 17:08
Посмотрел в ДевТулсе свойство overscroll-behavior: none; присутствует, проверил в Chrome и Chromium ...
bezumkin
Василий Наумкин
03.11.2022 20:57
Поискать в исходниках ссылки на её адрес и поменять - скорее всего только nuxt.config.js. А зачем эт...
ni.kolokol@mail.ru
Николай Каленников
03.11.2022 19:43
Спасибо. Попробую тоже с нуля переставить
inetlover
Александр Наумов
03.11.2022 19:24
Спасибо!!! Все заработало!
bezumkin
Василий Наумкин
28.10.2022 05:23
В тексте есть подсказка // Контроллер требует новое разрешение protected $scope = &#x27;ord...
bezumkin
Василий Наумкин
27.10.2022 13:25
Понял, спасибо!
inetlover
Александр Наумов
23.10.2022 13:33
Понял, спасибо!