msAltCart

Альтернативный скрипт корзины для магазина на базе MiniShop2 3.0.7 и выше.
Автор дополнения
Артур Шевченко
Пакетов
31
Закачек
3 469
Обычно отвечает в течение суток
Автор дополнения
Пакетов
31
Закачек
3 469
Обычно отвечает в течение суток
Версия 1.2.5-pl
Дата выпуска 18.08.2026
Загрузки 57
Просмотры 3 973
Внимание, этот компонент несовместим с MODX 3.
Компонент некорректно работает с другими компонентами, меняющими ключи товаров в корзине, например, с msPromoCode2.

Зависимости
  • SendIt v2.0.2 и выше
  • MiniShop 2 3.0.7 и выше
  • pdoTools 2.13.2 и выше

Возможности
  • Вывод любого количества корзин на одной страницы.
  • Динамическое обновление всех корзин.
  • Каждая корзина может иметь собственный шаблон.
  • Изменение опций в корзине.
  • JS API для программного управления корзиной.
  • Получение статуса и состава корзины на фронте.
  • Изменение логики работы посредством JS событий.
  • Есть поддержка модификаций msOptionsPrice2.
  • Кастомизация поля ввода количества.

Особенности
  • Компонент заменяет стандартный класс-обработчик корзины на свой.
  • Компонент делает метод getProductKey() публичным.
  • Компонент добавляет плагин на событие msOnCreateOrder, меняющий имя товара на имя модификации, если таковая была выбрана.

Подробнее о работе компонента читайте в документации.

1.2.5-pl

  • Исправлено: корзина переставала вызывать колбэки miniShop2, если ядро магазина загрузилось позже неё. Ссылка на miniShop2 запоминалась один раз, при инициализации, и при позднем ядре навсегда оставалась пустой: подписанные на Cart.*.response.success пакеты (например, компонент скидок, обновляющий состав корзины) управления не получали — подарок появлялся и пропадал только после перезагрузки страницы. Теперь miniShop2 разрешается при каждом обращении.

1.2.4-pl

  • Добавлено: msAltCartHandler::renderProductRow() — разметка строки корзины по переданным данным. Разметка собирается один раз, при чтении корзины, а компонент скидок пересчитывает свою копию строки уже после этого: без точки рендера по собственным данным он возвращал фронту разметку прошлого состояния — у только что добавленного подарка каталожную цену вместо нулевой, и она держалась до перезагрузки страницы. getProductRow() теперь обёртка над новым методом, сигнатура прежняя.

1.2.3-pl

  • Исправлено: серверный HTML корзины печатал сумму позиции на копейку меньше итога. Сниппет getCarts считал её как количество × цену единицы в обход msAltCartHandler::getItemCost(), поэтому строка с округлённой ценой (212.33 × 3) давала 636.99 при точной сумме 637.00 — расхождение держалось до ответа getcart.
  • Скидка позиции в getCarts тоже считается разницей сумм, а старая сумма позиции (old_cost) выставляется явно: раньше её приходилось брать из строки хранилища, которое при ms2_tmp_storage=db сумм не отдаёт.

1.2.2-pl

  • Исправлено: сумма позиций в корзине расходилась с итогом, когда в корзине больше одного товара. Точная сумма позиции сверялась с состоянием строки только по количеству, а пересчёт скидок меняет разбивку внутри позиции (было «две единицы со скидкой из трёх», стало «три») — количество прежнее, цена и сумма другие: строка печатала новую сумму, а итог считался по старой.
  • Точная сумма несёт полный отпечаток состояния: exact_cost, exact_count и новое exact_price. msAltCartHandler::getItemCost() принимает её только при совпадении и количества, и цены единицы; снимок без exact_price (формат до 1.2.2-pl) не принимается вовсе — отличить в нём устаревшую сумму от актуальной нельзя.
  • getCartItem() пишет отпечаток всегда, а не только когда сумма расходится с ценой × количеством. Раньше пары в строке чаще всего не было, и после перезагрузки страницы серверный HTML печатал price × count с потерянной копейкой (636.99 вместо 637.00) — число исправлялось только ответом getcart.
  • Требует msProductDiscounts 2.7.6-rc и выше, если суммы считает он. Порядок выкладки: сначала msAltCart, потом msProductDiscounts.

1.2.1-pl

  • Исправлено: сумма позиции теряла копейку, когда цена единицы округлена, а сумма на количество не делится нацело. Компоненты скидок (msProductDiscounts) размазывают скидку в среднюю цену за штуку: три товара по 245 со скидкой 20 % на две единицы дают цену 212.33, и price × count давало 636.99 вместо 637.00 — в строке корзины, в итогах и в сумме заказа.
  • Новый метод msAltCartHandler::getItemCost($item, $count, $price): сумма позиции — цена × количество, но если в строке лежит точная сумма (exact_cost) и количество, для которого она посчитана (exact_count), совпадает с текущим, берётся она. Пару полей кладёт источник скидки; количество изменилось — сумма считается обычным способом.
  • Через getItemCost() теперь считают cost в get(), getCartItem(), getProductRow() и status(). Скидка позиции и total_discount считаются как разница сумм (old_cost − cost), а не как округлённая цена × количество: иначе выгода расходилась с суммами в строке.
  • getProductRow() перестал отдавать чанк строки без cost/old_cost: хранилище db возвращает строку без сумм, и после перезагрузки страницы они не подставлялись.
  • Исправлено: пересборка строки в getCartItem() теряла поля, положенные другими компонентами (msProductDiscounts кладёт в строку original_price, discount_number и прочее). По ним считается сводка корзины, поэтому сразу после добавления товара цена до скидки равнялась цене со скидкой, а выгода была нулевой. Теперь свои поля строка пересчитывает, чужие сохраняет.
  • Требует msProductDiscounts 2.7.2-rc и выше, если суммы считает он. Порядок выкладки: сначала msAltCart, потом msProductDiscounts.

1.2.0-pl

  • Корзина сама перерисовывается по внешнему событию об изменении состава на сервере. Сторонние компоненты (например msProductDiscounts, добавляющий или снимающий подарок при пересчёте скидок) больше не должны трогать разметку корзины и вызывать её методы: достаточно бросить событие с составом и итогами, остальное корзина делает сама и без лишнего запроса.
  • Список таких событий — MsAltCart.config.syncEvents, по умолчанию mspd:cart:changed. Свой источник подключается методом MsAltCart.addSyncEvent('mycomponent:cart:changed').
  • Ожидаемый detail события: products (состав, у каждого товара html по имени корзины) и totals (итоги). Корзина удаляет пропавшие строки, дорисовывает новые, обновляет существующие и перерисовывает итоги, после чего отменяет событие — для источника это признак, что корзина перерисована и перезагружать страницу не нужно.
  • Перед синхронизацией бросается отменяемое событие msac:cart:sync:before с detail {products, totals, source}: его отмена пропускает синхронизацию.

1.1.7-pl

  • Добавлено логирование через mxLogger (раньше логов не было). Новый класс msacLogger (core/components/msaltcart/msacLogger.class.php) делегирует записи сервису mxLogger; единственный приёмник, стандартный журнал MODX не используется (лишь разовый näg, если mxLogger не установлен). Включено из коробки: msac_debug=Да, msac_log_level=error.
  • Коннектор (snippet.msacconnnector) логирует каждое cart-действие: запрос и успех — debug, неуспех — warning; тэги msaltcart + cart + действие (cart_add/remove/change/clean/status). Воронка process_uid по сессии.
  • Новые настройки msac_debug и msac_log_level.
  • ВНИМАНИЕ: перед сборкой настройки msac_debug/msac_log_level создать в менеджере (namespace msaltcart) — сборка тянет настройки из БД стенда.

1.1.6-pl

  • Исправил устаревшее значение cost в методе get() msAltCartHandler: теперь оно пересчитывается по актуальным price и count перед форматированием, по аналогии с old_cost.

1.1.5-pl

  • Переименовал метод refresh() в updateCarts

1.1.4-pl

  • Добавил в метод get() обработчика корзины html для каждого товара.
  • Добавил метод refresh() для обновления на фронте всей корзины.

1.1.3-pl

  • Добавил приведение к float в msAltCartHandler::get()

1.1.2-pl

  • Поменял порядок формирования массива $total в сниппите getCarts, чтобы он соответствовал формату возвращаемого значения метода status.
  • Добавил возможность передавать превью через properties
  • Изменил метод формирования ключа товара в корзине, теперь можно передавать отдельные опции с префиксом opt_
  • Добавил явное преобразование типов при передачи значений в метод formatPrice и formatWeight
  • Изменил порядок инициализации JS.

1.1.1-pl

  • Убрал return в runCallback, чтобы выполнялись всe обработчики

1.1.0-pl

  • Исправил опечатку в плагине на событие OnLoadWebDocument
  • Добавил форматированные значения веса и цен с постфиксом _str
  • Сделал сохранение контекста в куки.
  • Добавил получение старой цены товара из модификации.
  • Добавил JS событие 'msac:wrap:visibility:toggle:before' для возможности изменять логику переключения видимости обёрток.
  • Улучшил совместимость с msOptionPrice2
  • Переопределил метод get() в классе msAltCartHandler.
  • Добавил комментарии к получению хоста в плагине.

1.0.10-pl

  • Добавил в JS API метод updateAllRows() для обновления всех товаров во всех корзинах.
  • Исправил баг связанный с обновлением SendIt

1.0.9-pl

  • Добавил проверку расположения обработчика корзины.
  • Внёс правки в JS API.
  • Добавил возможность указывать несколько блоков data-msac-totals и data-msac-empty в корзине.
  • Добавил в сниппет объединение данных товара из БД и из корзины.
  • Добавил в метод status обработчика корзины параметр old_cost.
  • Убрал original_price и original_old_price.
  • Добавил в JS метод toggleWrapperVisibility() для переключения видимости обёрток параметров и атрибут data-msac-prop-wrap.
  • Добавил в метод в status форматирование цен и веса.
  • Добавил возможность передавать контекст в формах изменения опций и количества в поле с именем ctx.

1.0.8-pl

  • Добавил событие msOnBeforeGetProductKey, которое позволяет гибко управлять генерацией ключей в корзине.

1.0.7-pl

  • Мелкие правки.

1.0.6-pl

  • Добавил метод getProductKey(), теперь есть поддержка miniShop2 с версии 3.0.7

1.0.5-pl

  • Поправил баг с событием инициализации, при котором оно срабатывало раньше, чем становился доступным объект MsAltCart.
  • Добавил в возвращаемые параметры при добавлении параметр row, содержащий данные последнего добавленного товара.
  • Добавил в возвращаемые значения параметр rid для добавления и изменения товаров, и параметр key для удаления.

1.0.4-pl

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

1.0.3-pl

  • Добавил проверку на наличие файлов компонента msOptionsPrice2.

1.0.2-pl

  • Добавил поддержку ванильных скриптов минишопа.
  • Добавил перевод ключей заголовков в нижний регистр.

1.0.1-pl

  • Добавил синхронизацию при использовании стандартной корзины.
  • Исправил ошибки при отсутствии чанка отдельного товара.

1.0.0-pl

  • Первая сборка.

Последние обсуждения в сообществе MODX.pro