При создании интернет-магазина мы часто оперируем одними и теми же инструментами – SKU, наборы, коллекции. Но бывает приходят клиенты с интересными требованиями к механизму продаж, один из таких механизмов - калькуляция товара по нескольким характеристикам и последующее добавление такого товара в корзину.
Опытные разработчики Битрикс сразу спросят: «А нафига? Чем тебе SKU не подходит?» А ответ тут простой, на каждый миллиметр габаритов не сделаешь SKU (при большом желании конечно можно), а их как минимум 3, а еще у нас 200+ цветов в палитре. Ах да, мы забыли о радиальных объектах, где размеры и стоимость высчитываются на основе диаметра. Вот тут нам на помощь и приходит ручная калькуляция товара.
Приступаем
Готовим задание на работы:
- Список свойств, которые будут участвовать в калькуляции
- Логика калькуляции – формулы, логика наценок и скидок, дополнительные расчеты:
- Внешний вид формы калькулятора
- Что отправляем в корзину и результат добавления в корзину
Пишем калькулятор
На основе задания и формул пишем калькулятор. Логику мы выносим на сторону клиента, чтобы не генерировать лишних запросов к базе. Существует чеклист для проверки такого калькулятора, которому мы следуем:
- У числовых полей установлены атрибуты min и max, в противном случае есть риск коллизий при расчетах. В случае если введенное значение выходит за обозначенные пределы, то сбрасываем на крайнее значение.
- Обязательные к заполнению поля содержат атрибут required и дополнительно контролируются скриптами и валидацией.
- Наличие значений по умолчанию.
- Если свойство содержит более 10 вариантов выбора, то рекомендуется использовать модальные окна для показа полного перечня вариантов (пример, 100500 цветов).
- Кнопка добавления в корзину добавляет созданный товар в корзину и выводит на экран извещение об успешности операции.
Калькулятор пишем на основе существующего элемента инфоблока, который нам подарит название, картинку товара и идентификатор для добавления в корзину.
Добавляем товар в корзину
У Битрикса существует функция "CSaleBasket::Add()" добавления товара, вот с помощью нее и будем добавлять наш несуществующий товар в корзинку.
В параметры подставляем полученные из скрипта значения. И вуаля, товар в корзине:
Когда нужны такие хитрости
Для примера такие работы мы делали для производителя вентиляционного оборудования, фабрики мебели и фабрики по изготовлению дверей. Теоретически, если вывести правильные формулы, этот подход к примеру, подойдет для сайтов ателье по пошиву одежды или обуви, где стоимость будет высчитываться исходя из физических данных человека (обхват груди, руки и пятки) и используемых материалов. Как результат, применяем данный подход там, где нужно каждый раз создавать сложный товар, а генерировать SKU невозможно или занимает слишком много ресурсов.