# Публикация виджетов

Основная информация по публикации виджетов доступна в нашем гайде.

# Типы виджетов

Виджеты могут размещаться на любой странице вашего сайта в любой её части и иметь любой дизайн.

Для сайтов интернет-магазинов существуют четыре типа виджетов в зависимости от контекста их использования:

  • Товар
  • Категория товара
  • Бренд/производитель товара
  • Компания

# AJAX пагинация

Если товары на странице добавляются асинхронно, то нельзя использовать команды _shoppilot.push() для добавления виджетов. Вместо этого необходимо использовать JS API напрямую.

<script>
  (function () {
    window._shoppilot = window._shoppilot || [];

    // Для удобства оборачиваем API в promise
    // После загрузки скрипта promise станет resolved
    var ShoppilotAPI = new Promise(function (resolve) {
      _shoppilot.push([
        '_setOnReady',
        function (Shoppilot) {
          resolve(Shoppilot);
        }
      ]);
    });

    // Стили виджетов
    _shoppilot.push(["_addStyles", "widgets"]);

    // Загрузчик скрипта
    var store_id = "<?= APLAUT_STORE_ID ?>";
    var theme_id = "default";
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.async = true;
    script.src =
      "//get.aplaut.io/f/v1/" + store_id + "/" + theme_id + "/app.js";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(script, s);
  })();
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

WARNING

В примере выше используется нативный Promise. Это API не поддерживается некоторыми старыми браузерами. Существуют кроссбраузерные библиотеки, например, jQuery Deferred.

Допустим, такой HTML уже вы загружаете через AJAX и уже добавили его в DOM:

<div class="products">
  <div class="product" data-id="10000">
    <div class="product-name">A product</div>
    <div class="product-rating"></div>
  </div>
  <div class="product" data-id="10001">
    <div class="product-name">A product</div>
    <div class="product-rating"></div>
  </div>
  <div class="product" data-id="10002">
    <div class="product-name">A product</div>
    <div class="product-rating"></div>
  </div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Где-то в вашем коде:

<script>
  var product_containers = document.querySelectorAll('.products .product');

  // Получаем объект API из промиса
  ShoppilotAPI.then(function (Shoppilot) {
    var ProductWidget = Shoppilot.require('product_widget');
    var MultiWidget = Shoppilot.require('multi_widget');

    // Создаём экземпляр виджета для каждого товара на странице
    var widgets = Array.prototype.slice
      .call(product_containers)
      .map(function (product_container) {
        var widget_container = product_container.querySelector(
          '.product-rating'
        );

        // В этом примере ID получаем из data-атрибута
        // Способ получения product_id неважен
        var product_id = product_container.dataset.id;

        return new ProductWidget({
          name: 'listing-inline-rating',
          product_id: product_id,
          container: widget_container
        });
      });

    // Одним запросом получаем все виджеты
    MultiWidget.render(widgets);
  });
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Last Updated: a month ago