Как реализовать? Интернет-магазин керамики
        Подскажите или намекните как правильно реализовать следующее:
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. Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)
Просто моё решение универсально и будет подходить для множества областей, где одинаковые названий коллекций точно есть)
Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)Встречалось, решено с помощью добавления производителя в заголовок (он нигде не фигурирует на сайте, но по нему вся привязка). Как ни крути, тут только неидентичные заголовки.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.