Как подставить автоматически местоположение пользователя

Столкнулся с такой ситуацией, что типовой функционал битрикса не определял в механизме оформления заказа моего местоположения. При этом, через 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'];
				}
			}
		}

	}
}

В данном обработчике я прописал вручную свойства местоположений, но, в принципе, можно было и настроить получение всех свойств из сущности заказа и выборку тех из них, которые имеют соответствующий тип данных. Я не посчитал нужным делать лишний запрос к базе данных, т.к. свойства заказа изменяются и добавляются крайне редко.

В результате, если местоположение есть - оно будет подставлено автоматически. 

Количество показов: 3075
13.10.2019

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.