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

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

45
13.10.2019
14.10.2019

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

	}
}

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

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



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

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