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

Дополнение: MiniShop2

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

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

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

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

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

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

Комментарии (14)

  1. Павел Романов 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=`Плинтус`
    ]]
    1. Дмитрий 14 августа 2017, 21:09 # 0
      Давайте с вашим вариантом разберемся

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

      при вызове сниппета страница не отображается вообще
      1. Дмитрий 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));
        1. Павел Романов 14 августа 2017, 23:31 # 0
          Естественно.
          Сорри, опечатался )
          1. man 15 августа 2017, 16:26 # +1
            я минут 15 залипал в этот коммент и пытался понять «зачем заменять идентичные строки?!»… Sublime помог понять
            =>
      2. Дмитрий 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 ну или заюзать для этого обычную ТВ-шку.
        Смысл в том, чтобы сначала получить все уникальные значения типа кафельной плитки (базовая плитка, плинтус, ступени), а затем выводить это в категории. Если не разберетесь, пишите, попробуем вместе сделать :)
        1. Дмитрий 14 августа 2017, 19:29 # 0
          Посложнее, конечно, чем предыдущий вариант, но зато более гибкий, позволяет что угодно таким образом сортировать и за один вызов сниппета.
        2. 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 коллекции, только зачем.

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

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

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

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

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

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

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

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

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

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

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