Корзина miniShop2: как добавить цену с аксессуарами через TV поля
При использовании стандартной корзины miniShop2 в Modx Revolution часто возникает ситуация, когда дополнительные аксессуары товара реализованы через TV-поля, а не через штатные опции. В результате калькулятор на странице товара корректно суммирует стоимость, но в корзину попадает только базовая цена. Разберём, как исправить это без переделки всей логики.
Почему возникает проблема с ценой в корзине
MiniShop2 по умолчанию получает цену товара из ресурса или его модификаций. Если аксессуары добавлены через TV-поля и обрабатываются отдельным JavaScript-скриптом, данные о дополнительной стоимости не передаются в корзину. Это приводит к тому, что итоговая сумма в корзине не учитывает выбранные дополнения.
Решение: передача цены с аксессуарами через JavaScript
Чтобы цена в корзине соответствовала расчётам на странице, необходимо модифицировать процесс добавления товара. Основная идея - перехватить событие добавления в корзину и подменить стандартную цену на итоговую, вычисленную вашим калькулятором.
1. Использование хука msOnBeforeAddToCart
В miniShop2 есть системное событие msOnBeforeAddToCart. Через него можно изменить цену перед сохранением в корзину. Создайте плагин, который будет:
- Получать данные из TV-полей (например, через
$product->get('tv_name')); - Вычислять итоговую стоимость с учётом аксессуаров;
- Устанавливать новую цену в
$response['price'].
Пример кода плагина:
if ($modx->event->name == 'msOnBeforeAddToCart') {
$product = $modx->getObject('msProduct', $id);
$accessoriesPrice = $product->getTVValue('accessories_price');
$response['price'] = $price + (float)$accessoriesPrice;
}2. Передача данных через JavaScript при клике на кнопку
Если вы не хотите менять серверную логику, можно модифицировать вызов добавления в корзину. В вашем JS-калькуляторе при нажатии на кнопку «Купить»:
- Получите итоговую цену из интерфейса;
- Измените атрибут
data-priceу формы или элемента корзины; - Вызовите стандартный метод
ms2.Cart.add().
Этот способ проще, но менее надёжен при отключенном JavaScript.
Альтернативные подходы без переделки опций
Если вы не хотите использовать опции miniShop2, рассмотрите следующие варианты:
- Создание модификаций товара: динамически генерируйте модификации на основе TV-полей и подставляйте нужную цену.
- Кастомный процессор корзины: переопределите стандартный процессор добавления, чтобы он учитывал TV-поля.
- Хранение аксессуаров в сессии: передавайте ID аксессуаров в сессию и пересчитывайте цену при оформлении заказа.
Проверка и тестирование
После внедрения любого из методов обязательно протестируйте:
- Добавление товара с разными комбинациями аксессуаров;
- Обновление страницы корзины - цена должна сохраняться;
- Оформление заказа - итоговая сумма должна совпадать с расчётами.
Исправление проблемы с ценой в корзине miniShop2 при использовании TV-полей не требует полной переделки. Достаточно грамотно применить хуки или модифицировать клиентский скрипт. Это сохранит существующую логику калькулятора и обеспечит корректную работу корзины.