2490
33.20
35.57
за сайт
- Проверено Modstore
- Бесплатные будущие обновления
- Работа на тестовом и публичном домене
- 12 месяцев тех. поддержки
Версия
3.1.0-pl
Дата выпуска
28.05.2026
Загрузки
0
Просмотры
496
Внимание, этот компонент требует PHP
8.2
или выше!
Внимание, этот компонент требует MODX 3 или выше.
Требования
Важно: название изменилось
Раньше компонент назывался ms_CDEK2, теперь произошло возвращение к корням — msCDEK, но с новой кодовой базой.
Что это
msCDEK — компонент для расчёта стоимости доставки через СДЭК, выбора пункта выдачи (ПВЗ) из списка или на карте, подсказок адреса через DaData. Работает с MiniShop3 версии 1.8.0-beta1 и выше.
Что нового в msCDEK 3.1.0-pl
Поддержка OpenStreetMap (Leaflet)
Теперь у пакета два провайдера карт. Выбор задаётся системной настройкой mscdek_main_map_provider: osm (по умолчанию, бесплатно, без ключа) или yandex. Ключ хранится в унифицированной настройке
mscdek_main_map_api_key и нужен только Яндексу. Для OSM с CDN автоматически подключаются Leaflet 1.9.4 и leaflet.markercluster 1.5.3 — никаких ручных подключений в шаблоне не требуется.
Автомиграция при обновлении
Старая настройка mscdek_main_yandex_map_api_key удалена. При апдейте пакета её значение, если оно было, автоматически переносится в mscdek_main_map_api_key, а mscdek_main_map_provider выставляется в
yandex. Если ключа не было — провайдер останется osm. Дополнительных действий после обновления делать не нужно.
Стабильность и UX карты
Карта теперь корректно поднимается, даже если контейнер становится видимым уже после инициализации (типичный кейс — лениво открываемая модалка): через ResizeObserver автоматически дёргается
invalidateSize, тайлы и кластеры пересчитываются под актуальный viewport. Выбранный ПВЗ на карте подсвечивается двойной окружностью (белая + зелёная), которая видна на любом фоне тайлов. Блок
статуса доставки [data-mscdek-status] теперь обновляется сразу после выбора маркера.
Лучше для разработчиков
В response при неудачном расчёте стоимости (success: false) появилось поле data.debug с конкретной причиной: тарифный код, отправленный запрос, ответ CDEK API и при наличии — api_error из последней
ошибки внешнего API. Сообщение пользователю осталось прежним и нейтральным (mscdek_error), детализация — только для разработчика в DevTools/Network.
Исправления
Исправлена двойная регистрация ассетов при повторном срабатывании OnLoadWebDocument в одном запросе — loadJSCSS теперь идемпотентен. Кластеры Leaflet больше не «съезжают» по карте из-за
CSS-конфликта с position: relative. removePointFromOrder больше не дёргает API, если поле point пустое — Network не засоряется ложными 404.
Лицензия OpenStreetMap
Карта в режиме osm рендерится на бесплатных тайлах tile.openstreetmap.org. Согласно лицензии ODbL и OSM Tile Usage Policy, требуется видимое указание авторства данных. В пакетных стилях стандартный
блок атрибуции Leaflet скрыт (для аккуратности UI), поэтому разместите в шаблоне рядом с картой или в подвале страницы текст «© OpenStreetMap contributors». Кроме того, OSM Tile Usage Policy не
рекомендует высоконагруженное коммерческое использование с публичных тайлов — при росте трафика подключите свой кеш/прокси тайлов или платный тайл-сервис.
Что нового в 3.0
Как выглядит вкладка СДЭК в админке
На странице редактирования заказа появляется вкладка «СДЭК» (через механизм MS3OrderTabsRegistry). На ней:
— стоимость доставки
— код выбранного ПВЗ
— список ПВЗ с расстоянием
— карта Яндекс с маркерами (если настроен API-ключ)
— кнопка «Пересчитать доставку» (по нажатию происходит пересчёт стоимости доставки и сохранение данных)
Как работает фронтенд
Для вывода списка ПВЗ на странице заказа:
Для карты:
Для подсказок адреса добавьте атрибут полю ввода и блок для списка:
Для отображения сроков и стоимости:
REST API
Компонент предоставляет REST API через роутер MiniShop3:
Расчёт пакетов
Компонент поддерживает 6 режимов расчёта пакетов для отправки:
События для расширения
Компонент генерирует события на PHP и JavaScript, которые позволяют изменить поведение без редактирования кода:
Быстрый старт
- MODX 3.x
- PHP >= 8.2
- MiniShop3 >= 1.8.0-beta1
Важно: название изменилось
Раньше компонент назывался ms_CDEK2, теперь произошло возвращение к корням — msCDEK, но с новой кодовой базой.
Что это
msCDEK — компонент для расчёта стоимости доставки через СДЭК, выбора пункта выдачи (ПВЗ) из списка или на карте, подсказок адреса через DaData. Работает с MiniShop3 версии 1.8.0-beta1 и выше.
Что нового в msCDEK 3.1.0-pl
Поддержка OpenStreetMap (Leaflet)
Теперь у пакета два провайдера карт. Выбор задаётся системной настройкой mscdek_main_map_provider: osm (по умолчанию, бесплатно, без ключа) или yandex. Ключ хранится в унифицированной настройке
mscdek_main_map_api_key и нужен только Яндексу. Для OSM с CDN автоматически подключаются Leaflet 1.9.4 и leaflet.markercluster 1.5.3 — никаких ручных подключений в шаблоне не требуется.
Автомиграция при обновлении
Старая настройка mscdek_main_yandex_map_api_key удалена. При апдейте пакета её значение, если оно было, автоматически переносится в mscdek_main_map_api_key, а mscdek_main_map_provider выставляется в
yandex. Если ключа не было — провайдер останется osm. Дополнительных действий после обновления делать не нужно.
Стабильность и UX карты
Карта теперь корректно поднимается, даже если контейнер становится видимым уже после инициализации (типичный кейс — лениво открываемая модалка): через ResizeObserver автоматически дёргается
invalidateSize, тайлы и кластеры пересчитываются под актуальный viewport. Выбранный ПВЗ на карте подсвечивается двойной окружностью (белая + зелёная), которая видна на любом фоне тайлов. Блок
статуса доставки [data-mscdek-status] теперь обновляется сразу после выбора маркера.
Лучше для разработчиков
В response при неудачном расчёте стоимости (success: false) появилось поле data.debug с конкретной причиной: тарифный код, отправленный запрос, ответ CDEK API и при наличии — api_error из последней
ошибки внешнего API. Сообщение пользователю осталось прежним и нейтральным (mscdek_error), детализация — только для разработчика в DevTools/Network.
Исправления
Исправлена двойная регистрация ассетов при повторном срабатывании OnLoadWebDocument в одном запросе — loadJSCSS теперь идемпотентен. Кластеры Leaflet больше не «съезжают» по карте из-за
CSS-конфликта с position: relative. removePointFromOrder больше не дёргает API, если поле point пустое — Network не засоряется ложными 404.
Лицензия OpenStreetMap
Карта в режиме osm рендерится на бесплатных тайлах tile.openstreetmap.org. Согласно лицензии ODbL и OSM Tile Usage Policy, требуется видимое указание авторства данных. В пакетных стилях стандартный
блок атрибуции Leaflet скрыт (для аккуратности UI), поэтому разместите в шаблоне рядом с картой или в подвале страницы текст «© OpenStreetMap contributors». Кроме того, OSM Tile Usage Policy не
рекомендует высоконагруженное коммерческое использование с публичных тайлов — при росте трафика подключите свой кеш/прокси тайлов или платный тайл-сервис.
Что нового в 3.0
- Вкладка СДЭК в карточке заказа — при редактировании заказа в админке появляется отдельная вкладка. На ней можно посмотреть выбранный ПВЗ, выбрать другой из списка, увидеть карту и пересчитать стоимость доставки. Всё без перезагрузки страницы.
- Сортировка ПВЗ по расстоянию — и на фронтенде, и в админке список пунктов выдачи сортируется от ближайшего к дальнему. Рядом с каждым ПВЗ показывается расстояние в километрах.
- Карта центрируется на ближайшем ПВЗ — при загрузке списка карта автоматически перемещается к ближайшему пункту выдачи и увеличивает масштаб (только на фронте).
- ПВЗ сохраняется в заказе — при оформлении заказа код выбранного ПВЗ передаётся в MiniShop3 через стандартный механизм валидации полей. Не нужно ничего дополнительно настраивать.
- Пересчёт доставки из админки — кнопка на вкладке СДЭК вызывает расчёт стоимости через API СДЭК на основе товаров в заказе и обновляет стоимость.
Как выглядит вкладка СДЭК в админке
На странице редактирования заказа появляется вкладка «СДЭК» (через механизм MS3OrderTabsRegistry). На ней:
— стоимость доставки
— код выбранного ПВЗ
— список ПВЗ с расстоянием
— карта Яндекс с маркерами (если настроен API-ключ)
— кнопка «Пересчитать доставку» (по нажатию происходит пересчёт стоимости доставки и сохранение данных)
Как работает фронтенд
Для вывода списка ПВЗ на странице заказа:
<div data-mscdek-list></div>Для карты:
<div class="hide" data-mscdek-map></div>Для подсказок адреса добавьте атрибут полю ввода и блок для списка:
<input type="text" name="street" data-mscdek-suggest-field>
<ul class="hide" data-mscdek-suggest-list></ul>Для отображения сроков и стоимости:
<div class="hide" data-mscdek-status></div>REST API
Компонент предоставляет REST API через роутер MiniShop3:
GET /api/v1/cdek/suggestions — подсказки адреса
GET /api/v1/cdek/points — список ПВЗ
GET /api/v1/cdek/status — статус доставки
POST /api/v1/cdek/status — сохранение выбранного ПВЗ
GET /api/v1/cdek/postal-code — индекс по городу
POST /api/v1/cdek/order/update-point — обновление ПВЗ из админкиРасчёт пакетов
Компонент поддерживает 6 режимов расчёта пакетов для отправки:
- 0 — один пакет, размеры складываются из товаров
- 1 — по одному пакету на каждую позицию
- 2 — по одному пакету на каждый товар
- 3 — расчёт по объёму (товары укладываются в коробки)
- 4 — один пакет с размерами из настроек
- 5 — один пакет с размерами из настроек и суммой весов товаров
События для расширения
Компонент генерирует события на PHP и JavaScript, которые позволяют изменить поведение без редактирования кода:
// PHP: подменить тариф
switch ($modx->event->name) {
case 'msCdekOnSetTariffCode':
$object->tariffCode = 123;
break;
}
// JS: изменить масштаб карты
document.addEventListener('mscdek:map:show', e => {
e.detail.object.mapUpdParams.zoom = 10;
});Быстрый старт
- Установите пакет через менеджер пакетов MODX
- В системных настройках (пространство имён mscdek) укажите логин и пароль API СДЭК
- Укажите почтовый индекс отправителя
- ID способов доставки и тарифы заполняются автоматически при установке
- Укажите шаблоны страниц с формой заказа
- Добавьте нужные блоки в чанк формы заказа
3.1.0-pl (2026-05-28)
Добавлено:
- Поддержка OpenStreetMap (Leaflet) в качестве провайдера карт.
- Системные настройки mscdek_main_map_provider (значения "osm" по умолчанию или "yandex") и mscdek_main_map_api_key (унифицированный ключ; нужен только для Yandex). Старая mscdek_main_yandex_map_api_key удалена.
- Resolver миграции: при обновлении пакета непустое значение mscdek_main_yandex_map_api_key переносится в mscdek_main_map_api_key, провайдер выставляется в "yandex"; иначе остаётся "osm". Старая настройка удаляется.
- В webConfig добавлено поле mapProvider; модуль map.js ветвит инициализацию, кластеризацию и маркеры по выбранному провайдеру.
- Для OSM подключаются Leaflet 1.9.4 и leaflet.markercluster 1.5.3 с CDN jsdelivr (без API-ключа).
- ResizeObserver на mapBlock: автоматический invalidateSize при появлении/изменении размеров контейнера (модалки и т.п.).
- В response при неудачном расчёте стоимости поле data.debug с конкретной причиной: tariff_code, request, и при наличии api_error из MsCdek\ExternalApi\Base::$lastError. Сообщение пользователю остаётся прежним (mscdek_error).
Изменено:
- loadJSCSS теперь идемпотентный (placeholder mscdek_jscss_loaded) — устраняет двойную регистрацию ассетов при повторном срабатывании OnLoadWebDocument в одном request.
- Для Leaflet CSS-правило .mscdek-cluster { position: relative } сужено до :not(.leaflet-marker-icon) — иначе divIcon-обёртки кластеров теряли absolute-позиционирование и «съезжали» вниз карты.
- list.js::onPointChange теперь явно вызывает getDeliveryStatus() после addPointToOrder() — блок [data-mscdek-status] обновляется сразу после выбора ПВЗ. Раньше зависело от ms3Hooks.afterAddOrder, который фильтровал по triggerFields, не включающим 'point' — статус не обновлялся.
- map.js::marker() для osm — на событие add Leaflet-маркера навешивается id = feature.properties.code на DOM-узел .leaflet-marker-icon. Это нужно, чтобы markPointOnMap(document.querySelector('#${code}')) находил маркер при выборе ПВЗ из select и подсвечивал его.
- .mscdek-pin.chosen дополнена box-shadow (двойной outline белый + зелёный) — гарантированная видимость зелёного кольца поверх любых тайлов карты.
Исправлено:
- removePointFromOrder больше не дёргает /api/v1/order/remove если поле point пустое. Раньше при заходе на страницу с выбранной не-ПВЗ-доставкой list.js всегда отправлял запрос на удаление, а ms3 семантически возвращает 404 «Field not found», если point не было в заказе — в Network висела красная строка без реальной ошибки. Теперь guard на pointField.value: пустое — выходим без запроса.
3.0.0-pl (2026-03-29)
Полный перенос на MODX 3 и MiniShop3.
Добавлено:
- Вкладка СДЭК на странице заказа в админке (MS3OrderTabsRegistry)
- Просмотр и смена ПВЗ из админки без перезагрузки страницы
- Пересчёт стоимости доставки из админки (recalculateCost)
- Сортировка ПВЗ по расстоянию от адреса покупателя (Haversine)
- Отображение дистанции в списке ПВЗ (фронтенд и админка)
- Центрирование карты на ближайшем ПВЗ
- Сохранение кода ПВЗ в заказе через order/add API MiniShop3
- Очистка поля point при смене доставки на курьерскую
- Событие msCdekOnSendRequest — перехват запросов к API СДЭК
- REST API эндпоинт POST /order/update-point для менеджера
- Предзагрузка данных товаров одним SQL-запросом (вместо N+1)
- Кэширование результата getVersion() через cacheManager
- Ленивая инициализация API-клиентов (Cdek, DaData)
- Защита от кэширования пустых ответов API
- Валидация кода ПВЗ через regex
- Санитизация входных данных в контроллере (XSS-защита)
- Маскирование Authorization токенов в debug-логах
- Unit-тесты (40 тестов): расчёт стоимости, пакеты, размеры, координаты
- ESLint для JS-кода фронтенда
- Автоматическая синхронизация ID доставок в системных настройках при установке
Изменено:
- Пространство имён: MsCdek\
- REST API вместо коннектора SendIt (/api/v1/cdek/*)
- Провайдер доставки: MsCdek\CdekDelivery (extends MiniShop3\Controllers\Delivery\Delivery)
- Плагин: переменная $msOrder вместо $order в msOnBeforeCreateOrder
- Чанк mscdekListItem: value опции = код ПВЗ (был адрес)
- Событие msOnBeforeGetDeliveryCost вместо msOnBeforeGetOrderCost
- Настройки переименованы: префикс mscdekmain и mscdekpackages
- Удалено дополнительное поле mscdek_size (используется стандартное поле MS3)
Исправлено:
- Авторизация эндпоинта updateOrderPoint — проверка isMember('Administrator')
- Извлечена общая логика расчёта calculateDeliveryCost() (DRY)
- Константы modX::LOG_LEVEL_ERROR вместо магических чисел
- Права mkdir 0755 вместо 0777
- Исправлен порядок сортировки и отрисовки списка ПВЗ на фронтенде


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