Как в событии onSaleDeliveryServiceCalculate получить данные?
Стоит такая задача:
Например, покупатель формирует заказ на сайте из нескольких позиций. Далее срабатывают ограничения, создается список доступных для текущего выбора покупателя доставок. Если все товары из заказа есть на складе, привязанном к доставке – все ок, радостно бежим оплачивать. А вот если нет - нужно чтобы к стоимости доставки прибавлялось по сколько-то рублей за каждый товар в заказе, которого нет на выбранном складе. При этом нужно пересчитывать все службы доставки сразу при попадании на страницу оформления заказа, чтобы рядом с ними стояла актуальная цифра.
OnSaleComponentOrderCreated->$arDeliveryServiceAll – почему-то не работает,
$order->getShipmentCollection – выдает какую-то ахинею. Пришла мысль, что пока ему не сделать save, все будет лежать где-то в аяксе. Ведь при загрузке страницы, пока аякс во фрейме все не посчитал, там нет никакой информации?
Я попробовал сделать в init.php функцию на событие onSaleDeliveryServiceCalculate – но тогда эта функция срабатывает раз 20, учитывая, что доставок много и, видимо, ограничения он при этом подсчете не учитывает. Еще у меня к каждой службе доставки привязан склад самовывоза, как получить хотя бы ID этого склада, я не нашел.
function setDelivery($result, $shipment, $deliveryID) {
$deliveryList = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment); // так получилось добыть список доставок с ограничениями, в документации ни слова об этом
foreach ($deliveryList as $delivery) {
$id[] = $delivery->getId(); // список ID доступных в заказе доставок
}
if (in_array($deliveryID, $id)) { // сравниваем содержимое аргумента с созданным ранее массивом
$deliveryPrice = $result->getDeliveryPrice();
if ($deliveryPrice > 0) {
$newValue = $deliveryPrice + сколько-то денег; // если получится вывести эту опцию в админку, будет здорово
$result->setDeliveryPrice($newValue); // пишем новую стоимость
}
}
}
На этом все, дальше тупик. Не понимаю, как внутри onSaleDeliveryServiceCalculate получить какие-то данные из shipmentcollection, событие срабатывает раньше других на странице. Нужно получить для доступных доставок данные о привязанных складах, чтобы проверять наличие там товара - тоже непонятно как.