[РЕШЕНО] Вывод товаров minishop2 по производителям
Как вывести товары в minishop2 с разбивкой по производителям. Чтобы при добавлении нового производителя и товаров от него они автоматически попадали в выборку. И имели следующий вид
Sony
Список товаров Sony
Samsung
Список товаров samsung
LG
Список товаров LG
И так далее.
Спасибо!
Sony
Список товаров Sony
Samsung
Список товаров samsung
LG
Список товаров LG
И так далее.
Спасибо!
Комментарии: 3
Есть несколько вариантов решения задачи:
Для создания отдельных страниц для брендов (выбрали Самсунг — попали на страницу Самсунг)
1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).
2) Создать единую страницу для всех брендов и воспользоваться этой инструкцией для настройки
Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами, но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.
Для создания отдельных страниц для брендов (выбрали Самсунг — попали на страницу Самсунг)
1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).
2) Создать единую страницу для всех брендов и воспользоваться этой инструкцией для настройки
Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами, но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.
1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).Такой вариант не подходит требования были именно выводить все товары в категории с разбивкой по производителям.
Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами,Так и поступил, если кому то понадобится забирайте.
Сниппет miniShopVendorsList
<?php
$output = '';
$categoryId = (int)$modx->getOption('category', $scriptProperties, -1);
if ($categoryId >= 0) {
$categoryEntries = [];
$categoriesQuery = $modx->newQuery('modResource');
$categoriesQuery->where(array(
'parent:IN' => array($categoryId),
'deleted' => false,
'hidemenu' => false,
'published' => true,
));
$categoriesResources = $modx->getCollection('modResource', $categoriesQuery);
foreach ($categoriesResources as $categoryResource) {
$categoryEntries[] = $categoryResource->get('id');
}
if (!empty($categoryEntries)) {
$vendorsListQuery = $modx->query("SELECT id, name FROM modx_ms2_vendors");
$vendorsListArray = $vendorsListQuery->fetchAll(PDO::FETCH_ASSOC);
if (!empty($vendorsListArray)) {
$tpl = $modx->getParser()->getElement('modChunk', 'miniShopVendorsProductsList');
$tpl->setCacheable(false);
foreach ($vendorsListArray as $vendorRow) {
$vendorData = $vendorRow;
$vendorData['id'] = (int) $vendorData['id'];
$vendorId = $modx->quote($vendorData['id'], PDO::PARAM_INT);
$vendorProductsQuery = $modx->query("SELECT id FROM modx_ms2_products WHERE vendor = $vendorId");
$vendorProductsArray = $vendorProductsQuery->fetchAll(PDO::FETCH_ASSOC);
foreach ($vendorProductsArray as $vendorProductRow) {
$vendorProductId = (int) $vendorProductRow['id'];
if (in_array($vendorProductId, $categoryEntries)) {
$vendorData['productsList'][] = $vendorProductId;
}
}
$vendorData['productsList'] = implode(', ', $vendorData['productsList']);
if (!empty($vendorData['productsList'])) {
$tpl->_processed = false;
$output .= $tpl->process($vendorData);
}
}
}
}
}
return $output;
Вывод на странице <div class="col-12">
<h3>[[+name]]</h3> // Название бренда
</div>
// Вывод товаров этого бренда
[[!msProducts?
&parents=`0`
&resources=`[[+productsList]]`
&tpl=`catalog_list`
]]
но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.В данном примере товаров всего около 100 шт. в 6 категориях и 5-6 брендов. В итоге на одной странице не больше 10-20 товаров. Поэтому в этом примере обошлись без ajax подгрузки.
PS код писал не сам, помог знакомый программист. Код писался «на коленке» по быстрому, если есть предложения по оптимизации и улучшению welcome
Конечно есть!
1) Отказаться от сырых запросов. Зачем сначала получать вендеров, потом получать id товаров и потом еще запускать сниппет для получения товаров по id, если в исходниках miniShop2 указана связь?
2) Зачем тук сложно реализована работа с чанком? Зачем чанку отключать кеширование? У меня, по крайней мере, никогда не было проблем с кешированием. На мой взгляд куда правильнее получить сервис pdoTools и использовать его метод getChank, тем самым получив возможность использовать в чанке fenom и обойтись одним чанком.
Думаю что код станет меньше и корректнее по отношению к MODX и установленным компонентам.
1) Отказаться от сырых запросов. Зачем сначала получать вендеров, потом получать id товаров и потом еще запускать сниппет для получения товаров по id, если в исходниках miniShop2 указана связь?
2) Зачем тук сложно реализована работа с чанком? Зачем чанку отключать кеширование? У меня, по крайней мере, никогда не было проблем с кешированием. На мой взгляд куда правильнее получить сервис pdoTools и использовать его метод getChank, тем самым получив возможность использовать в чанке fenom и обойтись одним чанком.
Думаю что код станет меньше и корректнее по отношению к MODX и установленным компонентам.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.