Автоматически подставляет город в поле LOCATION при оформлении заказа, определяя его по IP-адресу клиента через встроенный GeoIP-менеджер Битрикс, но только если пользователь ещё не выбрал город вручную.
| Код |
|---|
<?php
// /local/php_interface/init.php
use Bitrix\Main\EventManager;
use Bitrix\Main\Service\GeoIp\Manager;
use Bitrix\Sale\Location\LocationTable;
AddEventHandler('sale', 'OnSaleComponentOrderProperties', 'autoFillLocationByGeoIp');
function autoFillLocationByGeoIp(&$arUserResult, $request, &$arParams, &$arResult)
{
foreach ($arUserResult['ORDER_PROP'] as $propertyId => $value) {
$property = \CSaleOrderProps::GetList([], ['ID' => $propertyId])->Fetch();
if ($property['TYPE'] === 'LOCATION' && empty($request->getPost("ORDER_PROP_{$propertyId}"))) {
static $cityCode = null;
if ($cityCode === null) {
$ip = $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'];
$geoData = Manager::getDataResult($ip, LANGUAGE_ID);
if ($geoData->isSuccess() && $cityName = $geoData->getGeoData()->cityName) {
$location = LocationTable::getList([
'select' => ['CODE'],
'filter' => [
'=NAME.NAME' => $cityName,
'LANGUAGE_ID' => LANGUAGE_ID,
'=TYPE.CODE' => 'CITY'
],
'limit' => 1
])->fetch();
$cityCode = $location['CODE'] ?? false;
} else {
$cityCode = false;
}
}
if ($cityCode) {
$arUserResult['ORDER_PROP'][$propertyId] = $cityCode;
}
}
}
} |