Как реализовать? Интернет-магазин керамики

Подскажите или намекните как правильно реализовать следующее:

11000 товаров
У каждого производителя есть свои коллекции.
в коллекции существуют множество товаров (напольная плитка, плинтуса, настенная плитка и т.д.)

как в карточке товара (какая-либо коллекция) вставить все товары которые есть в этой коллекции

Пример:
Рассмотрим коллекцию А. в ней существует 3 вида товаров (Напольная, Настенная, и плинтуса)

если
в коллекции есть:
Плинтуса -> то выводить надпись Плинтус и все товары данной колекции
иначе если есть
Напольная плитка -> то выводить Напольная плитка и товары и т.д.

Извиняюсь за такое подробное описание, но я выложил суть вопроса как можно подробнее
Дмитрий
14 августа 2017, 14:23
3
586
0

Комментарии: 14

Павел Романов
14 августа 2017, 18:44
0
У товара делаете TV «prtype», где прописываете тип:
Напольная==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=`Плинтус`
]]
    Дмитрий
    14 августа 2017, 21:09
    0
    Давайте с вашим вариантом разберемся

    строка: if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
    Пишет ошибку

    при вызове сниппета страница не отображается вообще
      Дмитрий
      14 августа 2017, 21:51
      +1
      if($items) return $modx->getChunk('outer-tpl', array('items'->$items, 'title'=>$title));
      исправить на
      if($items) return $modx->getChunk('outer-tpl', array('items'=>$items, 'title'=>$title));
        Павел Романов
        14 августа 2017, 23:31
        0
        Естественно.
        Сорри, опечатался )
        man
        man
        15 августа 2017, 16:26
        +1
        я минут 15 залипал в этот коммент и пытался понять «зачем заменять идентичные строки?!»… Sublime помог понять
        =>
Дмитрий
14 августа 2017, 19:26
0
Можно сделать без ТВ. Таким образом не надо будет постоянно редактировать ТВ-шку, когда появляется новый параметр.
Я реализовал это так (реальный скрипт для магазина керамической плитки), работает вот здесь:
Код:
<?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 ну или заюзать для этого обычную ТВ-шку.
Смысл в том, чтобы сначала получить все уникальные значения типа кафельной плитки (базовая плитка, плинтус, ступени), а затем выводить это в категории. Если не разберетесь, пишите, попробуем вместе сделать :)
    Дмитрий
    14 августа 2017, 19:29
    0
    Посложнее, конечно, чем предыдущий вариант, но зато более гибкий, позволяет что угодно таким образом сортировать и за один вызов сниппета.
Stan Ezersky
15 августа 2017, 10:40
0
Сейчас обновляю товарищу его старый сайт, ещё сделанный на 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 коллекции, только зачем.

Если нужно готовое решение, пишите. Могу сделать сборку после сдачи проекта

Евгений Шеронов
15 августа 2017, 22:21
0
На днях выложу в магазин дополнение, которое как раз таки будет называться msVendorCollections. Есть привязка коллекции к производителю и ещё некоторые полезные штуки по интеграции с miniShop2.

Если дело ждёт пару дней — подождите) компонент как раз разрабатывался для магазина сантехники, и должен подойти для Вас)

Но в вашем случае делал бы так: Категория: Плитка. Подкатегории: Напольная, Настенная и т.д.
У других производителей же тоже есть такие категории. Поэтому именно категорию не нужно привязывать к к коллекции.
    Stan Ezersky
    16 августа 2017, 09:46
    0
    Только ещё могут быть к плитке (из коллекции) бордюры и декоры, плодить ещё категорию?
      Евгений Шеронов
      16 августа 2017, 10:54
      +1
      Да, конечно) Примерная структура такого магазина:
      Плитка
      -- Напольная
      -- Настенная 
      -- Плинтуса
      -- Бордюры
      -- Декоры
      Обои
      -- Матовые
      -- Глянцевые
      -- и т.д.
      Повторюсь, коллекция привязывается к производителю. И уже в товаре выбор коллекции.
      Коллекция — такой же объект, как и производитель в miniShop2, но со своими полями. Ресурсы для них не используются, выводить можно и через виртуальные страницы.

      С таким подходом можно получать такие страницы:
      Все товары из «Коллекция1»; Бордюры из «Коллекция1» и «Коллекция2»;
      А на странице товара: «Декоры из этой же коллекции», «Плинтуса» и т.д.

      И это гарантирует нормальное расположение товара в своей категории/подкатегории. Кто-то сможет искать только бордюры — и его не интересует что это за коллекция. Главное-чтобы подошла к текущей плитке.

      Возможно, мы говорим об одной и той же структуре разными словами) Но у меня такого не будет:
      'optionFilters' => '{"model:LIKE":"' ~ $_modx->resource.pagetitle ~ '"}',
      В один прекрасный момент кто-то решит поправить заголовок и всё навернётся)
        Stan Ezersky
        16 августа 2017, 11:10
        +1
        Смотрите какая штука, вас заказчик разнесёт в пух и прах за такую организацию. ПлинтусЫ, бордюры и декоры — это не плитка, даже для покупателя

        'optionFilters' => '{"model:LIKE":"' ~ $_modx->resource.pagetitle ~ '"}',
        В один прекрасный момент кто-то решит поправить заголовок и всё навернётся)

        В этом бизнесе коллекций не меняю свои названия, их удаляют
          Евгений Шеронов
          16 августа 2017, 13:31
          0
          Я описал примерную и понятную мне структуру, не погружаясь в эту область.

          Всё таки о технической части решения рассказываю, а не о том, как делать сайт по керамике)
          Компонент же не будет создавать структуру сайта, а представляет из себя удобный инструмент для связи коллекций товаров с производителем, минуя неудобства такой фильтрации.

          P.S. Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)
          Просто моё решение универсально и будет подходить для множества областей, где одинаковые названий коллекций точно есть)
            Stan Ezersky
            15 сентября 2017, 00:04
            0
            Вам ещё не встречались одинаковые названий коллекций у разных производителей? :)
            Встречалось, решено с помощью добавления производителя в заголовок (он нигде не фигурирует на сайте, но по нему вся привязка). Как ни крути, тут только неидентичные заголовки.