Столкнулся с такой ситуацией, что типовой функционал битрикса не определял в механизме оформления заказа моего местоположения. При этом, через GeoIP информацию по городу выдавало корректно. Скорей всего причина в том, что сайт на Украинском языке, а в ядро битрикса залита база на русском и английском языках. К тому же и GeoIP также отдает информацию на русском языке.
Решил написать свой небольшой скрипт автоматического определения местоположения пользователя и заполнение соответствующего поля.
Для этого, получил от GeoIP полную информацию по IP-адресу пользователя, получил оттуда название города (я воспользовался для этих целей бесплатным модулем "rover.geoip" из marketplace, но можно и самостоятельно настроить получение информации из геолокации).
Итак, создаем обработчик события "OnSaleComponentOrderProperties":
use \Bitrix\Main\Data\Cache;
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleComponentOrderProperties', array('initEvents', 'OnSaleComponentOrderPropertiesHandler'));
class initEvents{
static public function getLocationByCityName($cityName){
$cache = Cache::createInstance();
$cache_id=md5(serialize(['function'=>__FUNCTION__,'city_name'=>$cityName]));
$cache_time = 60*60*24*30*6;
$result = false;
if($cache->initCache($cache_time,$cache_id)){
$result = $cache->getVars();
} elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('sale')){
$search = \Bitrix\Sale\Location\Search\Finder::find(['filter'=>['=PHRASE'=>$cityName]]);
if($item = $search->fetch())
{
$id = $item['ID'];
$location = \Bitrix\Sale\Location\LocationTable::getById($id)->fetch();
$result = $location;
}
$cache->endDataCache($result);
}
return $result;
}
function OnSaleComponentOrderPropertiesHandler(&$arUserResult, $request, &$arParams, &$arResult){
$locationProps = [6,30,31]; // идентификаторы свойств-местоположений (по одному для каждого типа пользователя)
foreach ($locationProps as $pid){
if(isset($arUserResult['ORDER_PROP'][$pid]) && strlen($arUserResult['ORDER_PROP'][$pid])<=0
&& \Bitrix\Main\Loader::includeModule('rover.geoip')){
$ip = Rover\GeoIp\Location::getCurIp();
$location = Rover\GeoIp\Location::getInstance($ip);
$cityName = $location->getCityName();
$locationData = static::getLocationByCityName($cityName);
if(!empty($locationData)){
$arUserResult['ORDER_PROP'][$pid] = $locationData['CODE'];
}
}
}
}
}
В данном обработчике я прописал вручную свойства местоположений, но, в принципе, можно было и настроить получение всех свойств из сущности заказа и выборку тех из них, которые имеют соответствующий тип данных. Я не посчитал нужным делать лишний запрос к базе данных, т.к. свойства заказа изменяются и добавляются крайне редко.
В результате, если местоположение есть - оно будет подставлено автоматически.
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.