
- MODX 3
- PHP 8.2
- miniShop3
- Vue 3


В чанк оформления заказа:
[[!msydLexiconScript]]
[[!msYandexDelivery]]
<div data-msyd-widget></div>{'!msydLexiconScript' | snippet}
{'!msYandexDelivery' | snippet}
<div data-msyd-widget></div>Сниппет msYandexDelivery подключает CSS/JS чекаута и конфиг window.msYandexDeliveryFrontend. Скрипт CDN виджета ПВЗ грузится по требованию, когда активен тариф self_pickup. Контейнер data-msyd-widget скрыт, пока не выбран способ доставки Яндекса.
Чанк tplYandexDeliveryMethods — обёртка <div class="msyd-methods" data-msyd-methods> для списка методов доставки.
msYandexDelivery Назначение: зарегистрировать assets и конфиг фронта. Возвращает пустую строку.
| Параметр | По умолчанию | Описание |
|---|---|---|
connectorUrl | {assets_url}components/msyandexdelivery/connector.php | URL connector |
widgetScriptUrl | из msyandexdelivery_widget_script_url или CDN v2 | URL скрипта виджета |
city | из резолва города | Фиксированное имя города для карты. Для витрины надёжнее &geoId= |
geoId | из msyandexdelivery_widget_geo_id | geo_id центра карты. Алиас: geo_id |
height | из msyandexdelivery_widget_height | Высота виджета, px (минимум 200) |
Приоритет города карты:
&city=&geoId= / widget_geo_idwidget_city213)Пример для витрины в СПб:
[[!msYandexDelivery?
&geoId=`2`
&height=`500`
]]{'!msYandexDelivery' | snippet : [
'geoId' => 2,
'height' => 500,
]}msydLexiconScript Без параметров. Выводит window.msydLexicon с ключами фронта (подписи тарифов, кнопки, подсказки). Вызывайте до msYandexDelivery.
data-msyd-widget показывает панель до двери (time_interval) или карту ПВЗ (self_pickup) по тарифу выбранного msDelivery.form.ms3_order_form → connector.php?action=calculate → select_option.YaNddWidgetPointSelected → calculate + select_option с platform_station_id.msOrder.properties.msyandexdelivery (tariff, platform_station_id, address, price, delivery_days).msOnGetDeliveryCost и YandexDelivery::getCost() подставляют стоимость. При сохранении опции delivery_cost синхронизируется из option.price, а tariff выравнивается по delivery_id.Публичные действия коннектора (без mgr-auth): calculate, select_option, list_pickup_points.
yandexdelivery.js слушает:
ms3Hooks.addHook('afterAddOrder', …) при смене доставки и полей адреса (регистрация с retry, пока ms3Hooks не загрузился)ms3:ready при открытии чекаутаchange и input на полях адреса формыПеред «Рассчитать» виджет читает адрес из формы. Если адрес в форме есть, а виджет просит указать адрес, проверьте класс ms3_order_form, загрузку ms3.js и свежий ?v= у JS сниппета.

Скрипт по умолчанию: https://widget-pvz.dostavka.yandex.net/widget.js?v=2.
CDN-виджет показывает prod-каталог точек. Test API (b2b.taxi.tst.yandex.net) знает только часть московских станций. Если карта отдала точку, которой нет в test API, сервис пробует сопоставить адрес через pickup-points/list. Иначе покупатель увидит сообщение о расхождении каталогов.
ID ПВЗ с виджета часто приходит с дефисами. Platform API для части точек ждёт id без дефисов. Нормализация: MsYandexDelivery\Support\StationId::normalize().
geoId Это geo_id региона/города из location/detect, не id ПВЗ и не id склада.
Частые значения: Москва 213, Санкт-Петербург 2, Казань 43, Екатеринбург 54, Новосибирск 65.
MsYandexDelivery\Support\StationId::normalize(string $id): string
Нормализует ID ПВЗ: удаляет дефисы и преобразует к формату Platform API.
// Пример: виджет вернул "MSK-01-01", API ждёт "MSK0101"
$normalized = StationId::normalize('MSK-01-01'); // "MSK0101"Используется в YandexDeliveryService::selectOption() после выбора точки на чекауте.
MsYandexDelivery\Support\PickupStationMatcher
Сопоставляет точку из CDN-виджета (prod-каталог) с точкой в test API. Если API не знает точку, сервис ищет ближайшую по адресу через pickup-points/list.
Логика в YandexDeliveryService::matchStation():
if (!$apiKnowsStation) {
$matched = $matcher->findBestMatch($widgetPoint, $apiPoints);
// возвращает ближайшую точку из API или null
}Файл: core/components/msyandexdelivery/include/helpers.php
| Функция | Назначение |
|---|---|
msyd_get_draft_order() | Получить черновик заказа из сессии или БД |
msyd_build_cargo(array $products): array | Сформировать массив грузов из товаров заказа (вес, габариты, стоимость) |
msyd_resolve_widget_city(): array{city:string,geo_id:int} | Определить город для виджета: возвращает ['city' => 'Москва', 'geo_id' => 213] |
Пример использования msyd_build_cargo():
$products = $order->getMany('Product'); // msOrderProduct
$cargo = msyd_build_cargo($products);
// ['weight' => 2.5, 'dimensions' => [30, 20, 10], 'value' => 5000]Хелперы подключаются через require_once в сниппетах и процессорах.