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

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

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

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

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

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

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