Поддержка OpenStreetMaps в msCDEK

Привет, коллеги! Если коротко, то меня задолбали танцы с бубном вокруг API ключей для Янедкс.Карт и я добавим поддержку бесплатного, бесключевого OpenStreetMaps, теперь список ПВЗ на карте можно увидеть не получая никаких данных от Яндекса.

1. Поддержка OpenStreetMap (Leaflet)
Теперь у пакета два провайдера карт. Выбор задаётся системной настройкой mscdek_main_map_provider: osm (по умолчанию, бесплатно, без ключа) или yandex. Ключ хранится в унифицированной настройке
mscdek_main_map_api_key и нужен только Яндексу. Для OSM с CDN автоматически подключаются Leaflet 1.9.4 и leaflet.markercluster 1.5.3 — никаких ручных подключений в шаблоне не требуется.

2. Автомиграция при обновлении
Старая настройка mscdek_main_yandex_map_api_key удалена. При апдейте пакета её значение, если оно было, автоматически переносится в mscdek_main_map_api_key, а mscdek_main_map_provider выставляется в
yandex. Если ключа не было — провайдер останется osm. Дополнительных действий после обновления делать не нужно.

3. Стабильность и UX карты
Карта теперь корректно поднимается, даже если контейнер становится видимым уже после инициализации (типичный кейс — лениво открываемая модалка): через ResizeObserver автоматически дёргается
invalidateSize, тайлы и кластеры пересчитываются под актуальный viewport. Выбранный ПВЗ на карте подсвечивается двойной окружностью (белая + зелёная), которая видна на любом фоне тайлов. Блок
статуса доставки [data-mscdek-status] теперь обновляется сразу после выбора маркера.

4. Лучше для разработчиков
В response при неудачном расчёте стоимости (success: false) появилось поле data.debug с конкретной причиной: тарифный код, отправленный запрос, ответ CDEK API и при наличии — api_error из последней
ошибки внешнего API. Сообщение пользователю осталось прежним и нейтральным (mscdek_error), детализация — только для разработчика в DevTools/Network.

5. Исправления
Исправлена двойная регистрация ассетов при повторном срабатывании 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 не
рекомендует высоконагруженное коммерческое использование с публичных тайлов — при росте трафика (>2 запросов в секунду) подключите свой кеш/прокси тайлов или платный тайл-сервис.
Артур Шевченко
28 мая 2026, 20:25
modx.pro
384
+7
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0