Плоское меню из категорий товаров
Возникла задачка: выбрать все категории товаров и вывести их списком в одном месте. Этакое "плоское меню". 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
👍
👎
❤️
🔥
😮
😢
😀
😡
1 364
31.10.2013 00:16:31
Комментарии
bezumkin.ru
Личный сайт Василия Наумкина
Прямой эфир
Василий Наумкин
10.02.2025 05:39:25
Думаю да, можно. Но я не делал.
День рождения 42
11
Василий Наумкин
04.02.2025 19:27:08
Я таким давно не занимаюсь и с MODX не работаю.
Попробуйте обратиться к ребятам с modx.pro.
Создание нового проекта
65
Василий Наумкин
23.12.2024 05:33:00
В MODX сначала создали проблему, автоматически генерируя адреса, а потом "решили" заморозкой.
Так ч...
Вывод товаров на сайте
21
Дмитрий
14.12.2024 09:10:38
Василий, прошу прощения, тупанул, не разобрался сразу. Фреймворк отличный! "Чистый лист" на vue, рис...
Начинаем новый курс!
14
Василий Наумкин
05.12.2024 20:01:14
В итоге основная ошибка была в неправильном общем root в Nginx, из-за чего запросы не улетали на фай...
Запуск в продакшн
55
inna
06.11.2024 15:47:13
Да. Все работает. Спасибо.
Vesp 3.0
108
Василий Наумкин
01.07.2024 11:56:41
Да, верно, именно так.
А в контроллере, скорее всего, ловить данные методом post.
Оплата заказа
2
Василий Наумкин
26.06.2024 09:38:15
О, точно, вылезает если не залогинен.
Спасибо, исправил!
Обновление проекта
2
Василий Наумкин
20.03.2024 21:21:52
Volledig!
Поездка в Швейцарию
8
Андрей
14.03.2024 13:47:10
Василий! Как всегда очень круто! Моё почтение!
День рождения 41
6
Уровни подписки
Спасибо!
500 ₽ в месяц
Эта подписка ничего не даёт, просто возможность сказать спасибо за мои заметки. Подписчики отмечаются зелёненьким цветом в комментариях.
Большое спасибо!
1 000 ₽ в месяц
И эта подписка не даёт ничего, кроме оранжевого цвета в комментариях и возможности сказать спасибо, но уже большое!