Корзина 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-полей не требует полной переделки. Достаточно грамотно применить хуки или модифицировать клиентский скрипт. Это сохранит существующую логику калькулятора и обеспечит корректную работу корзины.

    Часто задаваемые вопросы