Как реализовать? Интернет-магазин керамики
Подскажите или намекните как правильно реализовать следующее:
11000 товаров
У каждого производителя есть свои коллекции.
в коллекции существуют множество товаров (напольная плитка, плинтуса, настенная плитка и т.д.)
как в карточке товара (какая-либо коллекция) вставить все товары которые есть в этой коллекции
Пример:
Рассмотрим коллекцию А. в ней существует 3 вида товаров (Напольная, Настенная, и плинтуса)
если
в коллекции есть:
Плинтуса -> то выводить надпись Плинтус и все товары данной колекции
иначе если есть
Напольная плитка -> то выводить Напольная плитка и товары и т.д.
Извиняюсь за такое подробное описание, но я выложил суть вопроса как можно подробнее
11000 товаров
У каждого производителя есть свои коллекции.
в коллекции существуют множество товаров (напольная плитка, плинтуса, настенная плитка и т.д.)
как в карточке товара (какая-либо коллекция) вставить все товары которые есть в этой коллекции
Пример:
Рассмотрим коллекцию А. в ней существует 3 вида товаров (Напольная, Настенная, и плинтуса)
если
в коллекции есть:
Плинтуса -> то выводить надпись Плинтус и все товары данной колекции
иначе если есть
Напольная плитка -> то выводить Напольная плитка и товары и т.д.
Извиняюсь за такое подробное описание, но я выложил суть вопроса как можно подробнее
Комментарии: 14
У товара делаете TV «prtype», где прописываете тип:
На странице коллекции собираете дочерние товары, у которых отмечены данные значения. Для этого можно сделать сниппет:
Делаете чанк outer-tpl c [[+title]] (заголовок) и [[+items]] (товары):
Вызываете на странице:
Напольная==1||Настенная==2||Плинтус==3
На странице коллекции собираете дочерние товары, у которых отмечены данные значения. Для этого можно сделать сниппет:
<?php
$items = $modx->runSnippet('pdoResources', array(
'limit'=>0,
'parents'=>$modx->resource->get('id'),
'tpl'=>$tpl,
'includeTVs'=>$includeTVs,
'tvFilters'=>'prtype==='.$prtype,
//еще какие-о параметры pdoResources
));
if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
Делаете чанк outer-tpl c [[+title]] (заголовок) и [[+items]] (товары):
<div>
<h3>[[+title]]</h3>
<div>[[+items]]</div>
</div>
Вызываете на странице:
[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`1`
&title=`Напольная`
]]
[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`2`
&title=`Настенная`
]]
[[Snippet?
&tpl=`******`
&includeTVs=`******`
&prtype=`3`
&title=`Плинтус`
]]
Давайте с вашим вариантом разберемся
строка: if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
Пишет ошибку
при вызове сниппета страница не отображается вообще
строка: if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
Пишет ошибку
при вызове сниппета страница не отображается вообще
if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
исправить на if($items) return $modx->getChunk('outer-tpl', array('items'=>$items, 'title'=>$title));
Естественно.
Сорри, опечатался )
Сорри, опечатался )
я минут 15 залипал в этот коммент и пытался понять «зачем заменять идентичные строки?!»… Sublime помог понять
=>
Можно сделать без ТВ. Таким образом не надо будет постоянно редактировать ТВ-шку, когда появляется новый параметр.
Я реализовал это так (реальный скрипт для магазина керамической плитки), работает вот здесь:
Код:
Смысл в том, чтобы сначала получить все уникальные значения типа кафельной плитки (базовая плитка, плинтус, ступени), а затем выводить это в категории. Если не разберетесь, пишите, попробуем вместе сделать :)
Я реализовал это так (реальный скрипт для магазина керамической плитки), работает вот здесь:
Код:
<?php
$pdo = $modx->getService('pdoTools');
$tplOuter = '@FILE:chunks/collection/collectionOuter.tpl';
$tplType = '@FILE:chunks/collection/typeTpl.tpl';
$tpl = '@FILE:chunks/collection/collectionProduct.tpl';
$query = $modx->newQuery('msProductData');
$query->leftJoin('modResource', 'modResource', 'modResource.id = msProductData.id');
$query->select('`msProductData`.`kafelType`');
$query->where(array(
'modResource.parent' => $collectionId
));
$query->distinct();
$query->prepare();
//return $query->toSQL();
$query->stmt->execute();
$kafels = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($kafels as $kafel){
$products = $pdo->runSnippet('msProducts',array(
'parents' => $collectionId,
'where' => '{"Data.kafelType:=":"'.$kafel['kafelType'].'"}',
'includeThumbs' => 'row',
'limit' => 0,
'tpl' => '@FILE:chunks/product/product.row.tpl'
));
$collectionTypeItems .= $pdo->getChunk($tpl,array(
'typeName' => $kafel['kafelType'],
'products' => $products
));
}
$output = $pdo->getChunk($tplOuter,array(
'output' => $collectionTypeItems
));
return $output;
Нужно только создать поле в таблице товаров KafelType ну или заюзать для этого обычную ТВ-шку. Смысл в том, чтобы сначала получить все уникальные значения типа кафельной плитки (базовая плитка, плинтус, ступени), а затем выводить это в категории. Если не разберетесь, пишите, попробуем вместе сделать :)
Посложнее, конечно, чем предыдущий вариант, но зато более гибкий, позволяет что угодно таким образом сортировать и за один вызов сниппета.
Сейчас обновляю товарищу его старый сайт, ещё сделанный на Drupal в 11 году и довольно мощный по старым стандартам.
Так вот по хранению контента у нас вышло вот такое дерево
Выбираются позиции по называнию коллекции, типа такого (для страницы «Коллекция»)
Ещё вариант, через связи забивать коллекцию.
В продолжение, «страница позиции из коллекции», выборка товаров из этой же коллекции
Если нужно готовое решение, пишите. Могу сделать сборку после сдачи проекта
Так вот по хранению контента у нас вышло вот такое дерево
Выбираются позиции по называнию коллекции, типа такого (для страницы «Коллекция»)
{var $Suite = $_modx->runSnippet('!msProducts', [
'parents' => 9,
'includeThumbs' => '300x300',
'limit' => '0',
'tpl' => 'mytpl',
'optionFilters' => '{"model:LIKE":"' ~ $_modx->resource.pagetitle ~ '"}',
])}
<h3 class="block-title">Из коллекции «{$_modx->resource.pagetitle}»</h3>
{$Suite}
У каждой позиции из каталога есть поле—опция «model», которое должно совпадать с названием коллекции.Ещё вариант, через связи забивать коллекцию.
В продолжение, «страница позиции из коллекции», выборка товаров из этой же коллекции
{var $similarModels = $_modx->runSnippet('!msProducts', [
'depth' => '3',
'resources' => '-' ~ $_modx->resource.id,
'parents' => 9,
'includeThumbs' => '300x300',
'limit' => '100',
'sortby' => 'id',
'sortdir' => 'ASC',
'optionFilters' => '{"model:LIKE":"' ~ $model ~ '"}',
'tpl' => 'mytpl',
])}
{if $similarModels != ''}
<h3 class="block-title">Ещё из коллекции {$model}</h3>
<div>
{$similarModels}
</div>
{/if}
Опять же, можно и через связи связать товары из 1 коллекции, только зачем.Если нужно готовое решение, пишите. Могу сделать сборку после сдачи проекта
На днях выложу в магазин дополнение, которое как раз таки будет называться msVendorCollections. Есть привязка коллекции к производителю и ещё некоторые полезные штуки по интеграции с miniShop2.
Если дело ждёт пару дней — подождите) компонент как раз разрабатывался для магазина сантехники, и должен подойти для Вас)
Но в вашем случае делал бы так: Категория: Плитка. Подкатегории: Напольная, Настенная и т.д.
У других производителей же тоже есть такие категории. Поэтому именно категорию не нужно привязывать к к коллекции.
Если дело ждёт пару дней — подождите) компонент как раз разрабатывался для магазина сантехники, и должен подойти для Вас)
Но в вашем случае делал бы так: Категория: Плитка. Подкатегории: Напольная, Настенная и т.д.
У других производителей же тоже есть такие категории. Поэтому именно категорию не нужно привязывать к к коллекции.
Только ещё могут быть к плитке (из коллекции) бордюры и декоры, плодить ещё категорию?
Да, конечно) Примерная структура такого магазина:
Коллекция — такой же объект, как и производитель в miniShop2, но со своими полями. Ресурсы для них не используются, выводить можно и через виртуальные страницы.
С таким подходом можно получать такие страницы:
Все товары из «Коллекция1»; Бордюры из «Коллекция1» и «Коллекция2»;
А на странице товара: «Декоры из этой же коллекции», «Плинтуса» и т.д.
И это гарантирует нормальное расположение товара в своей категории/подкатегории. Кто-то сможет искать только бордюры — и его не интересует что это за коллекция. Главное-чтобы подошла к текущей плитке.
Возможно, мы говорим об одной и той же структуре разными словами) Но у меня такого не будет:
Плитка
-- Напольная
-- Настенная
-- Плинтуса
-- Бордюры
-- Декоры
Обои
-- Матовые
-- Глянцевые
-- и т.д.
Повторюсь, коллекция привязывается к производителю. И уже в товаре выбор коллекции. Коллекция — такой же объект, как и производитель в miniShop2, но со своими полями. Ресурсы для них не используются, выводить можно и через виртуальные страницы.
С таким подходом можно получать такие страницы:
Все товары из «Коллекция1»; Бордюры из «Коллекция1» и «Коллекция2»;
А на странице товара: «Декоры из этой же коллекции», «Плинтуса» и т.д.
И это гарантирует нормальное расположение товара в своей категории/подкатегории. Кто-то сможет искать только бордюры — и его не интересует что это за коллекция. Главное-чтобы подошла к текущей плитке.
Возможно, мы говорим об одной и той же структуре разными словами) Но у меня такого не будет:
'optionFilters' => '{"model:LIKE":"' ~ $_modx->resource.pagetitle ~ '"}',
В один прекрасный момент кто-то решит поправить заголовок и всё навернётся)
Смотрите какая штука, вас заказчик разнесёт в пух и прах за такую организацию. ПлинтусЫ, бордюры и декоры — это не плитка, даже для покупателя
В этом бизнесе коллекций не меняю свои названия, их удаляют
В один прекрасный момент кто-то решит поправить заголовок и всё навернётся)'optionFilters' => '{"model:LIKE":"' ~ $_modx->resource.pagetitle ~ '"}',
В этом бизнесе коллекций не меняю свои названия, их удаляют
Я описал примерную и понятную мне структуру, не погружаясь в эту область.
Всё таки о технической части решения рассказываю, а не о том, как делать сайт по керамике)
Компонент же не будет создавать структуру сайта, а представляет из себя удобный инструмент для связи коллекций товаров с производителем, минуя неудобства такой фильтрации.
P.S. Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)
Просто моё решение универсально и будет подходить для множества областей, где одинаковые названий коллекций точно есть)
Всё таки о технической части решения рассказываю, а не о том, как делать сайт по керамике)
Компонент же не будет создавать структуру сайта, а представляет из себя удобный инструмент для связи коллекций товаров с производителем, минуя неудобства такой фильтрации.
P.S. Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)
Просто моё решение универсально и будет подходить для множества областей, где одинаковые названий коллекций точно есть)
Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)Встречалось, решено с помощью добавления производителя в заголовок (он нигде не фигурирует на сайте, но по нему вся привязка). Как ни крути, тут только неидентичные заголовки.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.