Заменить popap "Товар добавлен в корзину" на собственное окно

Просмотров: 2125

Задача: заменить модальное окно, которое появляется при добавлении товара в корзину — "Товар добавлен в корзину". Сделать его удобнее для покупателя.

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

Заменить окно Товар добавлен в корзину

Это окно не очень удобно для пользователя, так как его каждый раз нужно закрывать. Да и в целом выглядит как что-то устаревшее (хотя его можно стилизовать).

Мы же сделаем окно-уведомление с автоматическим скрытием. В это окно можно вставить что угодно, передав данные с помощью CUtil::PhpToJSObject, включая ссылку на переход в корзину или закрытие вручную.

Стили и создание окна управляются очень гибко, можно модифицировать поведение и внешний вид как угодно под дизайн сайта.

Отключаем штатное окно "Товар добавлен в корзину"

Для этого открываем файл script.js по пути ШАБЛОН_ВАШЕГО_САЙТА/components/bitrix/catalog.item/ШАБЛОН_ВАШЕЙ_КАРТОЧКИ. Удаляем в нем вызов (примерно на 24-й строке):

BX.extend(BasketButton, BX.PopupWindowButton);

В самом низу находим и блокируем функцию initPopupWindow:

initPopupWindow: function () {
    return false;
}
Эту заметку можно совместить с заметкой:
"Если товар в корзине, поменять кнопку на 'В корзине'".

Создаем собственное окно-уведомление

Пример работы на реальном сайте:
Магазин косметики и инструментов для косметологов.

Далее находим функцию basketResult: function (arResult) (она будет ближе к низу) и полностью заменяем ее на:

basketResult: function (arResult) {
    if (!BX.type.isPlainObject(arResult)) {
        return;
    }

    // Генерируем уникальный ID для текущего попапа
    var popupId = 'slideBasketPopup_' + Date.now();

    // Проверим и удалим все старые попапы (если нужно)
    var oldPopups = document.querySelectorAll('[id^="slideBasketPopup_"]');
    oldPopups.forEach(function (oldPopup) {
        // Плавное скрытие старого попапа
        oldPopup.style.transition = "opacity 0.5s ease-in-out, right 0.5s ease-in-out, top 0.5s ease-in-out";
        oldPopup.style.opacity = "0";
        // Удаляем старый через 500 мс
        setTimeout(function () {
            if (oldPopup.parentNode) {
                oldPopup.parentNode.removeChild(oldPopup);
            }
        }, 500);
    });

    // Теперь создаем и показываем новый попап с уникальным ID
    this._showBasketPopup(arResult, popupId);
},

_showBasketPopup: function (arResult, popupId) {
    if (arResult.STATUS !== 'OK') {
        // Алерт с ошибкой, если товар не добавился в корзину
        // можно тоже сделать красивым окном
        alert(arResult.MESSAGE || BX.message('BASKET_UNKNOWN_ERROR'));
        return;
    } else {
        // Если используем аналитику, оставляем это
        this.setAnalyticsDataLayer('addToCart');

        // Это нужно для AJAX счетчика малой корзины
        BX.onCustomEvent('OnBasketChange');

        var productPict = '';
        switch (this.productType) {
            case 1:
            case 2:
            case 7:
                productPict = this.product.pict.SRC;
                break;
            case 3:
                productPict = this.offers[this.offerNum].PREVIEW_PICTURE
                    ? this.offers[this.offerNum].PREVIEW_PICTURE.SRC
                    : this.defaultPict.pict.SRC;
                break;
        }

        // Название товара
        var productName = this.product.name;

        // Если картинки нет, подставляем nophoto.png
        var imgSrc = productPict && productPict.length > 0 ? productPict : "/local/img/nophoto.png";

        // Создание попапа
        var popup = BX.create("div", {
            // Оболочка с классом popap_basket_added
            attrs: {
                id: popupId,
                className: 'popap_basket_added'
            },
            children: [
                // Картинка
                BX.create("img", {
                    attrs: {
                        src: imgSrc,
                        alt: productName
                    }
                }),
                // Блок с названием
                BX.create("div", {
                    attrs: {className: 'popap_basket_added_inner'},
                    children: [
                        BX.create("span", {html: "Добавлено в корзину"}),
                        BX.create("strong", {html: productName})
                    ]
                })
            ]
        });

        // Добавляем попап в body
        document.body.appendChild(popup);

        // Плавно показываем попап через 50 мс
        setTimeout(function () {
            if (!popup) return;
            popup.style.right = "20px";
        }, 50);

        // Скрываем попап через 4 секунды
        setTimeout(function () {
            if (!popup) return;
            popup.style.right = "-300px";

            // Уничтожаем попап через 0.5 с после скрытия
            setTimeout(function () {
                 if (popup.parentNode) popup.parentNode.removeChild(popup);
            }, 500);

        }, 4000);
    } // end if (arResult.STATUS !== 'OK')
},

Внутри все максимально прокомментировано. Самая главная часть — создание и удаление окна с помощью BX.create. В него можно добавлять дополнительные блоки содержимого окна.

Тоже самое проделываем со script.js детальной карточки товара. Ну и собственно немного стилей, их корректируйте под себя:

/* CSS для .popap_basket_added */
.popap_basket_added {
  position: fixed;
  background-color: #fff;
  border-radius: 3px;
  z-index: 10000;
  display: flex;
  padding: 15px;
  opacity: 0.98;
  transition: all 0.5s ease-in-out;
  width: 280px;
  right: -300px;
  top: 30px;
  transform: translateX(-50%);
  box-shadow: 0px 12px 36px rgba(0, 0, 0, 0.1);
}
.popap_basket_added img {
  height: 80px;
  width: 80px;
  object-fit: contain;
  object-position: center;
  margin-right: 10px;
  border-radius: 4px;
  background: #fff;
}
.popap_basket_added_inner {
  color: darkgreen;
  font-size: 13px;
}
.popap_basket_added_inner span {
  display: block;
  margin-bottom: 2px;
}
.popap_basket_added_inner strong {
  /* стили для названия, если нужны */
}

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 550 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

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

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.