Необходимо было настроить дефолтное определение страны в новом шаблоне заказа. Для этого используем события и штатный функционал GeoIP.
Подключаем неймспейсы
use \Bitrix\Main\Service\GeoIp, \Bitrix\Sale\Location\LocationTable;
Создаём обработчик события
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible( 'sale', 'OnSaleComponentOrderProperties', 'SaleOrderEvents::fillLocation' ); class SaleOrderEvents { function fillLocation(&$arUserResult, $request, &$arParams, &$arResult) { } }
Непосредственно код, который будет модифицировать свойство LOCATION. Сначала получим код страны из GeoIP модуля. Думаю, что аналогично будет и код города подцепляться.
$ipAddress = GeoIp\Manager::getRealIp(); $result = GeoIp\Manager::getDataResult($ipAddress, LANGUAGE_ID); $geoData = $result->getGeoData(); $code = ToLower($geoData->countryCode);
Дальше используем код, чтобы задать нужное местоположение. Единственное условие, в местоположениях символьные коды должны соответствовать тем, что приходят из GeoIP. В принципе, можно получить символьный код местоположения по названию, но тогда надо следить, чтоб название местоположения соответствовало тому, что приходит из GeoIP. Так что выбираем наиболее безболезненный вариант.
$registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); $orderClassName = $registry->getOrderClassName(); $order = $orderClassName::create(\Bitrix\Main\Application::getInstance()->getContext()->getSite()); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection as $property) { if ($property->isUtil()) continue; $arProperty = $property->getProperty(); if( $arProperty['TYPE'] === 'LOCATION' && array_key_exists($arProperty['ID'],$arUserResult["ORDER_PROP"]) && !$request->getPost("ORDER_PROP_".$arProperty['ID']) && ( !is_array($arOrder = $request->getPost("order")) || !$arOrder["ORDER_PROP_".$arProperty['ID']] ) ) { $arUserResult["ORDER_PROP"][$arProperty['ID']] = $code; } }