msProductKits - удобное управление товарами-комплектами (наборами товаров)

Всем привет!

Сегодня хотел бы представить небольшой компонент под названием msProductKits, назначение которого — обеспечить удобную работу с товарами, представляющими собой комплект (набор) из других товаров. Компонент работает только с товарами miniShop2.

Пара сценариев, чтобы было понятно, для чего можно использовать:

1. Магазин шин и дисков.
В магазине продаются шины, колесные диски, их можно купить по одной штуке.
А еще мы хотим продавать промо-набор, куда входят: шины 4 шт, диски 4 шт, пакеты для хранения шин 4 шт и сертификат на шиномонтаж. При этом пакеты и сертификат отдельно купить нельзя, таких товаров на сайте нет.

2. Магазин производителя акустики.
Производитель выпускает несколько видов колонок, которые вполне себе можно купить по отдельности.
Но еще есть готовый набор, куда входят: 4 двухполосные акустические системы, центральный канал, сабвуфер и усилитель мощности. Этот набор можно купить целиком, на сайте он представлен отдельным товаром, причем его цена ниже, чем если покупать все отдельно. При этом усилитель отдельно не продается, это вообще сторонний усилитель, не этого производителя, он предлагается по партнерской программе.

Наша задача в обоих случаях — это у товара, представляющего собой «Комплект», сделать связи с другими товарами, указать сколько их штук входит в этот комплект, да еще как-то указать, что в этот комплект входят некие другие товары, которых нет на сайте и ссылку на них мы дать не можем.

Административная часть

msProductKits добавляет в карточке товара новую вкладку Комплекты, где можно прописать связи между товарами, а так же указать дополнительные сведения.

Для примера я использую демонстрационный каталог (магазин шин/дисков) со следующей структурой:


У товара появилась новая вкладка, где можно добавить позиции комплекта:


Каждая строка — это товар, являющийся частью комплекта. Товар может быть как ссылкой на существующий товар (msProduct), так и мы можем просто написать его название. Так же можно указать некоторые дополнительные сведения (описание, количество, артикул, производителя).



У товара, который при этом является частью комплекта, в этой вкладке отображаются все комплекты, в состав которых он входит.



Логично, что если товар является комплектом, то один товар — один комплект, а вот как часть товар может входить в любое количество комплектов.

Фронтэнд
На сайте можно вывести информацию при помощи сниппета msProductKits.

Параметры сниппета msProductKits:
  • resource — id товара, по-умолчанию текущий ресурс;
  • mode — режим работы сниппета, может принимать 2 значения: owner (делаем выборку товаров, которые входят в комплект) или product (делаем выборку тех товаров, в которые входит наш товар как часть комплекта). В режиме product имеет смысл либо делать join таблицы ресурсов, либо получать только id Товаров для последующего вывода их с помощью msProducts;
  • tpl — шаблон отображения одной строки;
  • sortby, sortdir — сортировка;
  • tplWrapper, wrapIfEmpty, outputSeparator, toPlaceholder, toSeparatePlaceholders — давно всем известные параметры;
  • ids — укажите 1, чтобы сниппет вернул только id ресурсов вместо полных данных.

Выводим товары, входящие в Комплект:


Выводим все комплекты, в состав которых входит товар:


Послесловие
В принципе компонент небольшой, и его функционал при желании можно реализовать и через MIGX, но это будет не так удобно и презентабельно.
Если есть предложения и идеи по развитию — пишете в комментариях.

Компонент доступен в ModStore: modstore.pro/packages/ecommerce/msproductkits
Наумов Алексей
21 декабря 2020, 10:08
modx.pro
1
593
+18
Поблагодарить автора Отправить деньги

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

Алексей Шумаев
21 декабря 2020, 11:37
+1
В чанк на фронте можно сразу добавить инфу о стоимости по отдельности и выгоде покупателя в комплекте.
Пользователям будет проще. Т.е. по отдельности сумма 35000, ваша выгода — 5000р, ~15%
    Роман
    21 декабря 2020, 11:44
    0
    Интересное решение. По шинам и дискам видал разные решения. У кого-то стоит кол-ве сразу 4 шт., у кого-то добавляются 4 шт. в корзину, а потом из корзины можно поменять кол-во. Сам буквально недавно реализовывал подобное решение, только для составных товаров.
      Spirit_Ninja
      24 декабря 2020, 16:29
      0
      Только недавно об этом думал! Очень полезно, спасибо.
      R2m0x94 (Vasily)
      30 декабря 2020, 00:59
      0
      Алексей, Спасибо. Тоже делал такой функционал, но только через тв. перечислял id дополнительных, но тут почувствовал гибкость исполнения. Только поставил и смотрю чанк. Предлагаю заменить на такой
      {var $item_name = $product | resource : 'pagetitle'}
      <tr>
          <td style="width: 40%;">
              {if $product > 0}
              <strong><a href="{$product | url}">{$item_name}</a></strong>
              {else}
              <strong>{$name}</strong>
              {/if}
          </td>
          <td style="width: 50%;"><small>{$description}</small></td>
          <td style="width: 10%; text-align: center;">
              <small>{$count} шт.</small>
          </td>
      </tr>
        Наумов Алексей
        30 декабря 2020, 09:35
        0
        Я так понимаю, что речь идет о том, чтобы показать комплекты, в которые входит товар?
        Здесь история в том, что по идее нужно вызывать msProducts, который отобразит товары так, как нужно (с подключением изображений, параметров и т.д.).
        Я для этих случаев просто получал ids товаров, а после передавал их в msProducts:
        {set $ids = $_modx->runSnippet('!msProductKits', ['mode' => 'product','ids' => 1])}
        {if $ids}
        {'!msProducts' | snippet : [
            'parents' => 0,
            'resources' => $ids,
            'limit' => 0,
        ]}
        {/if}
        R2m0x94 (Vasily)
        30 декабря 2020, 01:16
        0
        Но при добавлении к товару, когда после перейти в пакет msProductKits, там пусто :'( печалька…
        Владимир
        25 февраля 2021, 15:34
        0
        Добрый день, Алексей.
        Почему-то не срабатывает сниппет в плагине на событие OnDocFormSave:
        $modx->runSnippet('!msProductKits', ['resource' => $id, 'mode' => 'owner', 'ids' => 1]);
        Если вызывать кэшируемый msProductKits, то вечное сохранение документа. Не подскажите в чем может быть дело? Хотел при сохранении комплекта суммировать стоимость его компонентов и сохранить в price.
          Наумов Алексей
          25 февраля 2021, 16:15
          0
          Не нужно вызывать сниппет в плагине, реально плохая идея… ну как из пушки по воробьям…
          Напишите просто нужный вам запрос, он будет не очень сложным.
          Хотя, конечно, в целом сработать то должно было) Может еще в чем дело? Сниппет строку вернет, это учитывали?
            Владимир
            25 февраля 2021, 16:28
            0
            Строку учитывал. К сожалению, не силен в этом. В основном по описаниям компонентов работаю. Спасибо.
              Владимир
              25 февраля 2021, 17:30
              0
              С запросом справился)
                Наумов Алексей
                26 февраля 2021, 09:18
                0
                Отлично! Было бы интересно услышать отзыв по компоненту, я сам его использовал только на одном сайте и обратная связь не помешала бы, возможно стоит что-то улучшить.
                  Владимир
                  26 февраля 2021, 14:24
                  +1
                  Компонент полезный и удобный в плане администрирования, для моей задачи очень хорошо подошел. Из предложений, в моем случае, было бы удобно если в системных настройках была возможность ограничить не более одного товара из каждой категории. И хорошо бы реализовать цену всего комплекта суммированием стоимости товаров, входящих в состав комплекта, но это можно и самостоятельно. Спасибо за компонент!
                    Владимир
                    26 февраля 2021, 15:17
                    0
                    Еще цену входящих в комплект товаров можно в таблицу добавить.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          16