API

Notification API

Описание

Единый API уведомлений для всех модулей темы. Использует Toastify и предоставляет унифицированный интерфейс для отображения toast-уведомлений о товарах и простых текстовых сообщений.

Доступ к API

API входит в состав минифицированного бандла темы assets/js/site.theme.min.js и доступен глобально:

window.waTheme.notificationAPI

Алиас для обратной совместимости: window.waTheme.notificationService

Уведомления из DOM-элементов (атрибут data-toastify) инициализируются автоматически; при необходимости можно вызвать вручную:

window.waTheme.notificationAPI.initFromDOM();

Настройки темы

Настройки для каждого типа события

Уведомления настраиваются отдельно для каждого типа события (корзина, избранное, сравнение) с возможностью выбора устройств:

НастройкаНазвание в настройках темы
apps__shop_common_notification_cart_type_buttonsУведомления корзины
apps__shop_common_notification_wishlist_type_buttonsУведомления избранного
apps__shop_common_notification_compare_type_buttonsУведомления сравнения

Опции для каждой настройки:

  • everywhere — «Везде» (по умолчанию)

  • desktop — «Только на десктопе»

  • mobile — «Только на мобильном»

  • disabled — «Нигде»

Позиция уведомлений

  • Десктоп: настройка «Позиция уведомления (десктоп)» — apps__shop_common_product_added_notification_position_type_buttons (значения: bottom-right, bottom-left, top-right, top-left, top-center, bottom-center; по умолчанию top-right — «Верх справа»)

  • Мобильные: всегда top-center (фиксированная позиция)

Все значения доступны в window.waTheme.themesettings.settings[<key>].value.

Пример чтения настроек

// Проверка, нужно ли показывать уведомления корзины
const cartNotification = window.waTheme?.themesettings?.settings?.['apps__shop_common_notification_cart_type_buttons']?.value || 'everywhere';

// Получение позиции для десктопа
const position = window.waTheme?.themesettings?.settings?.['apps__shop_common_product_added_notification_position_type_buttons']?.value || 'top-right';

// Проверка типа устройства
const isMobile = window.waTheme?.is_mobile === '1' || window.waTheme?.is_mobile_checking_by_wa === '1';

// Определение, показывать ли уведомление
const shouldShow =
  cartNotification === 'everywhere' ||
  (cartNotification === 'desktop' && !isMobile) ||
  (cartNotification === 'mobile' && isMobile);

if (shouldShow && window.waTheme?.notificationAPI) {
  window.waTheme.notificationAPI.cart.added('123', 2);
}

API автоматически проверяет настройки перед показом уведомлений, поэтому в большинстве случаев достаточно просто вызывать методы cart.added(), wishlist.added() и т.д.

Настройки по умолчанию

{
  duration: 4,              // Длительность показа в секундах
  position: 'bottom-right', // Резервная позиция — используется, только если настройка темы недоступна
  close: true,              // Показывать кнопку закрытия
  width: 'w-80'             // Фиксированная ширина 320px (Tailwind)
}

Фактическая позиция уведомления определяется автоматически: на мобильных — top-center, на десктопе — из настройки темы «Позиция уведомления (десктоп)» (по умолчанию top-right).

Публичные методы

showProductNotification(options)

Показывает уведомление о товаре с изображением, названием и дополнительной информацией.

Если передан параметр type (cart, wishlist, compare), метод автоматически проверяет настройки темы и может не показывать уведомление, если оно отключено для данного типа или устройства.

Параметры:

ПараметрТипОписание
productIdstring/numberID товара (обязательный)
messagestringТекст сообщения (обязательный)
productNamestringНазвание товара
productImagestringURL изображения
additionalInfostringДополнительная информация
showLinkbooleanПоказывать ссылку
linkUrlstringURL ссылки
linkTextstringТекст ссылки
durationnumberДлительность показа в секундах
typestringТип уведомления: cart, wishlist, compare, default
positionstringПозиция уведомления (по умолчанию определяется автоматически)
closebooleanПоказывать кнопку закрытия

Примеры использования:

Базовое уведомление:

notificationAPI.showProductNotification({
  productId: '123',
  message: 'Товар добавлен в корзину'
});

Уведомление со ссылкой:

notificationAPI.showProductNotification({
  productId: '123',
  message: 'Товар добавлен в корзину',
  productName: 'Джемпер флисовый',
  productImage: '/path/to/image.jpg',
  showLink: true,
  linkUrl: '/cart/',
  linkText: 'Перейти в корзину',
  duration: 5
});

Уведомление с проверкой настроек:

notificationAPI.showProductNotification({
  productId: '123',
  message: 'Товар добавлен',
  additionalInfo: '(2 шт.)',
  type: 'cart' // API проверит настройки корзины перед показом
});

Уведомление без проверки настроек:

notificationAPI.showProductNotification({
  productId: '123',
  message: 'Специальное уведомление',
  type: 'default' // Или не передавать type — уведомление будет показано всегда
});

showSimpleNotification(message, duration, extraOptions)

Показывает простое текстовое уведомление без изображения товара.

Параметры:

  • message (string) — текст сообщения

  • duration (number) — длительность показа в секундах (по умолчанию 4)

  • extraOptions (Object) — дополнительные опции (position, close)

Примеры использования:

// Простое сообщение
notificationAPI.showSimpleNotification('Операция выполнена успешно');

// С настройкой длительности
notificationAPI.showSimpleNotification('Товар удален', 3);

// С дополнительными опциями
notificationAPI.showSimpleNotification(
  'Изменения сохранены',
  5,
  { position: 'top-right', close: true }
);

initFromDOM()

Инициализирует уведомления из DOM-элементов с атрибутом data-toastify.

Пример HTML:

<!-- Уведомление с задержкой -->
<div data-toastify='{"html": "<div>Успешно сохранено</div>", "delay": 1, "remove": true}'>
</div>

<!-- Уведомление с контентом из элемента -->
<div data-toastify='{"duration": 5, "position": "top-right"}'>
  <div class="p-4">Ваше сообщение здесь</div>
</div>

Параметры data-toastify (JSON):

ПараметрТипОписание
htmlstringHTML-контент (если не передан, берется innerHTML элемента)
durationnumberДлительность показа в секундах
delaynumberЗадержка перед показом в секундах
positionstringПозиция уведомления
closebooleanПоказывать кнопку закрытия
removebooleanУдалить элемент после показа
// Вызывается автоматически при инициализации темы
// Или можно вызвать вручную для динамически добавленных элементов
notificationAPI.initFromDOM();

Специализированные методы

Уведомления для корзины (cart)

cart.added(productId, quantity, productName, productImage)

Товар добавлен в корзину.

Параметры:

  • productId (string|number) — ID товара

  • quantity (number) — количество (по умолчанию 1)

  • productName (string) — название товара

  • productImage (string) — URL изображения

notificationAPI.cart.added('123', 2);
// Показывает: "В корзине (2 шт.)" со ссылкой "Перейти в корзину"

cart.removed(itemInfo)

Товар удален из корзины.

Параметры:

  • itemInfo (Object) — информация о товаре:

  • product_id (string) — ID товара

  • name (string) — название

  • image_url (string) — URL изображения

  • quantity (number) — количество

notificationAPI.cart.removed({
  product_id: '123',
  name: 'Джемпер флисовый',
  image_url: '/path/to/image.jpg',
  quantity: 2
});
// Показывается 3 секунды

cart.updated(itemInfo, newQuantity)

Количество товара в корзине обновлено.

Параметры:

  • itemInfo (Object) — информация о товаре (см. cart.removed)

  • newQuantity (number) — новое количество

notificationAPI.cart.updated(itemInfo, 5);
// Показывает: "Количество обновлено (5 шт.)" со ссылкой "Перейти в корзину"

cart.maxQuantity(productId, maxQuantity)

Достигнуто максимальное количество товара.

Параметры:

  • productId (string|number) — ID товара

  • maxQuantity (number) — максимальное количество

notificationAPI.cart.maxQuantity('123', 10);
// Показывает: "Достигнуто максимальное количество (макс. 10 шт.)"

Уведомления для избранного (wishlist)

wishlist.added(productId, productName, productImage)

Товар добавлен в избранное.

notificationAPI.wishlist.added('123');
// Показывает: "В избранном" со ссылкой "Перейти к избранному"

wishlist.removed(productId, productName, productImage)

Товар удален из избранного.

notificationAPI.wishlist.removed('123');
// Показывает: "Удален из избранного" (3 секунды)

Уведомления для сравнения (compare)

compare.added(productId, productName, productImage)

Товар добавлен к сравнению.

notificationAPI.compare.added('123');
// Показывает: "В сравнении" со ссылкой "Перейти к сравнению"

compare.removed(productId, productName, productImage)

Товар удален из сравнения.

notificationAPI.compare.removed('123');
// Показывает: "Удален из сравнения" (3 секунды)

Автоматическое получение данных товара

Если название или изображение товара не переданы явно, API автоматически пытается найти их.

Источники данных (в порядке приоритета):

  1. Из data-атрибутов кнопки: <button data-product-id="123" data-product-name="Джемпер" data-product-image="/path/to/image.jpg">

  2. Из данных корзины — поиск в window.waTheme.cart.items по полю product_id (ключом в items служит идентификатор позиции корзины, а не ID товара): items.find(i => i.product_id === String(productId))

  3. Из карточки товара на странице: <div data-product="123"> <img src="/path/to/image.jpg" alt="Товар"> </div>

  4. Значения по умолчанию: название — window.waTheme?.locale?.product || 'Товар', изображение — window.waTheme?.theme?.url + 'assets/img/svg/empty_photo.svg'

Локализация

API использует глобальные переменные локализации из window.waTheme.locale:

{
  in_cart: 'В корзине',
  go_to_cart: 'Перейти в корзину',
  removed_from_cart: 'Удален из корзины',
  quantity_updated: 'Количество обновлено',
  maximum_quantity_reached: 'Достигнуто максимальное количество',
  in_wishlist: 'В избранном',
  go_to_wishlist: 'Перейти к избранному',
  removed_from_wishlist: 'Удален из избранного',
  in_comparison: 'В сравнении',
  go_to_comparison: 'Перейти к сравнению',
  removed_from_comparison: 'Удален из сравнения',
  product: 'Товар'
}

Структура HTML уведомления

Уведомление о товаре

<div class="w-80 flex items-start gap-3 p-4 pr-10 bg-white border border-gray-200 rounded-theme shadow-theme dark:bg-neutral-800 dark:border-neutral-700">
  <div class="flex-shrink-0">
    <img src="..." alt="..." class="aspect-square size-12 min-w-12 rounded-theme object-cover">
  </div>
  <div class="flex-1">
    <div class="text-sm text-inverse font-semibold">
      В корзине
    </div>
    <div class="text-sm text-inverse">
      Джемпер флисовый (2 шт.)
    </div>
    <a href="/cart/" class="text-sm mt-2 text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300">
      Перейти в корзину
    </a>
  </div>
</div>

Простое уведомление

<div class="w-80 flex items-center gap-3 p-4 pr-10 bg-white border border-gray-200 rounded-theme shadow-theme dark:bg-neutral-800 dark:border-neutral-700">
  <div class="flex-1">
    <div class="text-sm text-inverse font-semibold">
      Операция выполнена успешно
    </div>
  </div>
</div>

Отступ pr-10 в обеих обёртках оставляет место под кнопку закрытия уведомления.

Обратите внимание: классы text-blue-* в CSS темы не генерируются — в палитре Tailwind темы нет цвета blue, поэтому в собранном site.theme.min.css таких правил нет и ссылка просто наследует цвет текста. В собственной разметке уведомлений используйте классы темы, например link-theme или text-theme-500:

<a href="/cart/" class="text-sm mt-2 link-theme">
  Перейти в корзину
</a>

Интеграция с другими API

Cart API

// Cart API автоматически использует Notification API
await cartAPI.add({ product_id: '123', sku_id: '456' });
// Notification API автоматически покажет уведомление

Wishlist API

// Wishlist API автоматически использует Notification API
wishlistAPI.addToWishlist(productId);
// Автоматическое уведомление о добавлении

Compare API

// Compare API автоматически использует Notification API
compareAPI.addToCompare(productId);
// Автоматическое уведомление о добавлении

Примеры использования

Базовая интеграция

const { cartAPI, notificationAPI } = window.waTheme;

// При добавлении товара в корзину
document.querySelector('.js-add-to-cart').addEventListener('click', async (e) => {
  const productId = e.target.dataset.productId;

  try {
    await cartAPI.add({ product_id: productId, quantity: 2 });
    // Уведомление показывается автоматически через Cart API
  } catch (error) {
    notificationAPI.showSimpleNotification('Ошибка добавления товара', 3);
  }
});

Кастомное уведомление

// Уведомление о специальной акции
notificationAPI.showProductNotification({
  productId: '999',
  message: 'Специальная цена!',
  additionalInfo: '(скидка 50%)',
  showLink: true,
  linkUrl: '/promo/',
  linkText: 'Узнать больше',
  duration: 6,
  position: 'top-center'
});

Динамические уведомления из бэкенда

<!-- В Smarty-шаблоне -->
{if $success_message}
  <div data-toastify='{"duration": 5, "remove": true}'>
    <div class="w-80 p-4 bg-green-100 border border-green-200 rounded-theme">
      <div class="text-sm font-semibold text-green-800">
        {$success_message}
      </div>
    </div>
  </div>
{/if}

<script>
  // Инициализация после загрузки DOM
  document.addEventListener('DOMContentLoaded', () => {
    window.waTheme.notificationAPI.initFromDOM();
  });
</script>

Рекомендации

  1. Используйте специализированные методы (cart.added, wishlist.added) вместо прямого вызова showProductNotification

  2. Передавайте данные явно, если они доступны, чтобы избежать поиска в DOM

  3. Настраивайте duration в зависимости от важности сообщения: успешные действия — 4 секунды (по умолчанию), удаления — 3 секунды, важные сообщения — 5–6 секунд

  4. Используйте data-toastify для серверных уведомлений

  5. Используйте локализацию из window.waTheme.locale

Примечания

  • Все методы cart, wishlist и compare автоматически используют локализацию

  • При отсутствии данных товара используются значения по умолчанию

  • Уведомления адаптированы под темную тему (dark mode)

  • Ширина уведомлений фиксирована (320px) для консистентности

  • API экспортируется как singleton instance для использования во всех модулях