Your IP : 18.222.100.201


Current Path : /var/www/u0635749/data/www/hobbyclick.ru/public/bitrix/modules/sale/general/
Upload File :
Current File : /var/www/u0635749/data/www/hobbyclick.ru/public/bitrix/modules/sale/general/ym_location.php

<?php

use Bitrix\Sale\Location\ExternalTable,
	\Bitrix\Main\Localization\Loc;

IncludeModuleLangFile(__FILE__);

/**
 * Class CSaleYMLocation
 * Mapping yandex locations to bitrix locations
 */
class CSaleYMLocation
{
	private $cityNames = null;
	private $cacheId = "CSaleYMLocations";

	const EXTERNAL_SERVICE_CODE = 'YAMARKET';

	public function __construct(){}

	/**
	 * returns locations data
	 */
	private function getData()
	{
		if($this->cityNames !== null)
			return $this->cityNames;

		$ttl = 2592000;
		$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();

		if(false && $cacheManager->read($ttl, $this->cacheId))
		{
			$cityNames = $cacheManager->get($this->cacheId);
		}
		else
		{
			$cityNames = $this->loadDataToCache();
			$cacheManager->set($this->cacheId, $cityNames);
		}

		$this->cityNames = $cityNames;
		return $cityNames;
	}

	/**
	 * Loads data from base
	 */

	private function loadDataToCache()
	{
		$result = array();

		$res = \Bitrix\Sale\Location\LocationTable::getList(array(
			'filter' => array(
				'=NAME.LANGUAGE_ID' => 'ru',
				'=TYPE.CODE' => array('CITY')
			),
			'select' => array(
				'ID',
				'NAME_NAME' => 'NAME.NAME'
			)
		));

		$replaceFrom  = explode(',', Loc::getMessage('SALE_YML_REPLACE_FROM'));

		while($loc = $res->fetch())
		{
			$result[$loc['ID']] = str_replace(
				$replaceFrom,
				Loc::getMessage('SALE_YML_REPLACE_TO'),
				ToLower($loc['NAME_NAME'])
			);
		}

		return $result;
	}

	/**
	 * @param $cityName
	 * @return int location id
	 */
	public function getLocationByCityName($cityName)
	{
		$this->getData();
		$result =  array_search(
			str_replace(
				explode(
					',',
					Loc::getMessage('SALE_YML_REPLACE_FROM')
				),
				Loc::getMessage('SALE_YML_REPLACE_TO'),
				ToLower(
					$cityName
				)
			),
			$this->cityNames
		);
		return $result;
	}

	protected function getLocationByExternalIds($yandexLocationsIds)
	{
		if(empty($yandexLocationsIds))
			return array();

		$result = array();

		$res = ExternalTable::getList(array(
			'filter' => array(
				'=XML_ID' => $yandexLocationsIds,
				'=SERVICE.CODE' => self::EXTERNAL_SERVICE_CODE
			)
		));

		while($loc = $res->fetch())
			$result[$loc['XML_ID']] = $loc['LOCATION_ID'];

		return $result;
	}

	protected function extractLocations($yandexLocation)
	{
		if(empty($yandexLocation) || !is_array($yandexLocation))
			return array();

		$result = array();
		$tmp = $yandexLocation;
		unset($tmp['parent']);
		$result[$tmp['id']] = $tmp;

		if(!empty($yandexLocation['parent']))
			$result = $result + $this->extractLocations($yandexLocation['parent']);

		return $result;
	}

	public function getLocationId($yandexLocation)
	{
		if(empty($yandexLocation) || !is_array($yandexLocation))
			return false;

		$locations = $this->extractLocations($yandexLocation);

		if(empty($locations))
			return false;

		$mapExternal = $this->getLocationByExternalIds(array_keys($locations));

		if(!empty($mapExternal))
			foreach($locations as $yLocId => $yLocParams)
				if(!empty($mapExternal[$yLocId]))
					return $mapExternal[$yLocId];

		if(empty($yandexLocation["name"]))
			return false;

		return $this->getLocationByCityName($yandexLocation["name"]);
	}
}