%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/location/import/compiler/db/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/location/import/compiler/db/exporttreeukrain.php |
<?php
/**
* This class is for internal use only, not a part of public API.
* It can be changed at any time without notification.
*
* @access private
*/
namespace Bitrix\Sale\Location\Import\Compiler\Db;
use Bitrix\Main;
use Bitrix\Main\Entity;
use Bitrix\Sale\Location;
class ExportTreeUkrainTable extends ExportTreeTable
{
public static function getFilePath()
{
return __FILE__;
}
public static function getTableName()
{
return 'b_tmp_export_tree_ukrain';
}
protected $settlementParent = array();
protected $types = false;
protected $typeMap = array(
1 => 'CITY', //| місто | город |
2 => 'VILLAGE', //| смт | пгт |
3 => 'VILLAGE', //| селище | поселок |
4 => 'VILLAGE', //| село | село |
5 => 'VILLAGE', //| хутір | хутор |
6 => 'VILLAGE', //| ст. | ст. |
7 => 'VILLAGE', //| санат. | санат. |
8 => 'VILLAGE', //| радгосп | совхоз |
9 => 'VILLAGE', //| вокзал | вокзал |
10 => 'VILLAGE', //| лісництво | лесничество |
11 => 'VILLAGE', //| док | док |
12 => 'VILLAGE', //| поселення | поселение |
);
public function getMappedType($typeId)
{
$dbConnection = Main\HttpApplication::getConnection();
if($this->types == false)
{
$res = $dbConnection->query('select ID, NAME, NAME_RU from b_tmp_ukrain_settlement_type');
while($item = $res->fetch())
{
$this->types[$item['ID']] = array('NAME' => array(
'ua' => array('NAME' => $item['NAME']),
'ru' => array('NAME' => $item['NAME_RU'])
));
}
}
return $this->typeMap[$typeId];
}
public function addNode($data)
{
$data['LANGNAMES'] = serialize($data['NAME']);
$data['NAME'] = $data['NAME']['ru']['NAME'];
$data['CODE'] = $this->formatCode($this->exportOffset);
$data['SYS_CODE'] = 'U_'.intval($data['ID']);
unset($data['ID']);
if(isset($data['ZIP']))
{
$data['EXTERNALS'] = serialize(array(
'ZIP' => $data['ZIP']
));
}
$res = self::add($data);
if($res->isSuccess())
{
$this->exportOffset++;
return $data['CODE'];
}
return false;
}
public function addRegion($params)
{
$dbConnection = Main\HttpApplication::getConnection();
$item = $dbConnection->query("select NAME, NAME_RU from b_tmp_ukrain_region where ID = '".intval($params['ID'])."'")->fetch();
return $this->addNode(array(
'ID' => $params['ID'],
'TYPE_CODE' => 'REGION',
'PARENT_CODE' => $params['PARENT_CODE'],
'NAME' => $this->getNames($params['ID'], 'REGION')
));
}
public function addArea($params)
{
$dbConnection = Main\HttpApplication::getConnection();
$item = $dbConnection->query("select NAME, NAME_RU from b_tmp_ukrain_area where ID = '".intval($params['ID'])."'")->fetch();
return $this->addNode(array(
'ID' => $params['ID'],
'TYPE_CODE' => 'AREA',
'PARENT_CODE' => $params['PARENT_CODE'],
'NAME' => $this->getNames($params['ID'], 'AREA')
));
}
public function getNames($id, $type)
{
$dbConnection = Main\HttpApplication::getConnection();
switch($type)
{
case 'REGION':
$table = 'b_tmp_ukrain_region';
break;
case 'AREA':
$table = 'b_tmp_ukrain_area';
break;
case 'CITY':
$table = 'b_tmp_ukrain_city';
break;
case 'VILLAGE':
$table = 'b_tmp_ukrain_village';
break;
}
$item = $dbConnection->query("select NAME, NAME_RU from ".$table." where ID = '".intval($id)."'")->fetch();
$replaceFrom = array('обл.', 'р-н');
$replaceTo = array('область', 'район');
return array(
'ua' => array('NAME' => str_replace($replaceFrom, $replaceTo, $item['NAME'])),
'ru' => array('NAME' => str_replace($replaceFrom, $replaceTo, $item['NAME_RU']))
);
}
public function getSettlementParentCode($params)
{
$key = intval($params['AREA_ID']) ? $params['AREA_ID'] : $params['REGION_ID'];
if(!isset($this->settlementParent[$key]))
{
if(!isset($this->settlementParent[$params['REGION_ID']]))
{
// new region!
$code = $this->addRegion(array(
'ID' => $params['REGION_ID'],
'PARENT_CODE' => '',
));
$this->settlementParent[$params['REGION_ID']] = $code;
}
if(intval($params['AREA_ID']))
{
if(!isset($this->settlementParent[$params['AREA_ID']]))
{
// new area!
$code = $this->addArea(array(
'ID' => $params['AREA_ID'],
'PARENT_CODE' => $this->settlementParent[$params['REGION_ID']],
));
$this->settlementParent[$key] = $code;
}
}
}
return $this->settlementParent[$key];
}
public function buildFromUADB($options)
{
if(isset($options['NEXT_FREE_CODE']))
$this->exportOffset = intval($options['NEXT_FREE_CODE']);
$dbConnection = Main\HttpApplication::getConnection();
// settlements
$res = $dbConnection->query('select ID, ZIP, ZIP_TO, TYPE_ID, CITY_ID, REGION_ID, AREA_ID, VILLAGE_ID from b_tmp_ukrain_settlement');
while($item = $res->fetch())
{
$code = $this->getSettlementParentCode(array(
'REGION_ID' => $item['REGION_ID'],
'AREA_ID' => $item['AREA_ID']
));
// now there can be several situations
$type = $this->getMappedType($item['TYPE_ID']);
// records where CITY_ID and VILLAGE_ID filled both
if(intval($item['CITY_ID']) && intval($item['VILLAGE_ID']))
{
$type = 'VILLAGE';
// must be attached to CITY
$code = $this->settlementParent[$item['CITY_ID']];
$id = $item['VILLAGE_ID'];
//$item['VILLAGE_ID']
}
elseif(intval($item['CITY_ID']))
{
$type = 'CITY';
$id = $item['CITY_ID'];
}
$this->settlementParent[$key] = $this->addNode(array(
'ID' => $item['ID'],
'TYPE_CODE' => $type,
'PARENT_CODE' => $code,
'NAME' => $this->getNames($id, $type),
'ZIP' => $item['ZIP'],
'ZIP_TO' => $item['ZIP_TO'],
));
}
}
public function create()
{
$dbConnection = Main\HttpApplication::getConnection();
$table = static::getTableName();
global $DB;
if(!$DB->query('select * from '.$table.' where 1=0', true))
{
$dbConnection->query("create table ".$table." (
ID int not null auto_increment primary key,
CODE varchar(100),
PARENT_CODE varchar(100),
SYS_CODE varchar(100),
TYPE_CODE varchar(20),
FIAS_TYPE varchar(10),
NAME varchar(100) not null,
NAME_UA varchar(100) not null,
ZIP varchar(10),
ZIP_TO varchar(10),
LANGNAMES varchar(300),
EXTERNALS varchar(200),
LATITUDE varchar(30),
LONGITUDE varchar(30),
ALTERNATE_COORDS varchar(100),
BOUNDED_WITH varchar(100),
SOURCE varchar(2) default 'U'
)");
// SYS_CODE will be U_ + settlement id
$this->restoreIndexes();
}
}
/*
public function dropCodeIndex()
{
unset($this->codeIndex);
if(!empty($this->regionCodeIndex))
$this->codeIndex = $this->regionCodeIndex;
}
public function insert($data)
{
if(isset($this->codeIndex[$data['SYS_CODE']])) // already in there
return;
if($data['TYPE_CODE'] == 'REGION')
$this->regionCodeIndex[$data['SYS_CODE']] = $this->formatCode($this->exportOffset);
$this->codeIndex[$data['SYS_CODE']] = $this->formatCode($this->exportOffset);
$data['CODE'] = $this->codeIndex[$data['SYS_CODE']];
$data['PARENT_CODE'] = strlen($data['PARENT_SYS_CODE']) ? $this->codeIndex[$data['PARENT_SYS_CODE']] : '';
unset($data['PARENT_SYS_CODE']);
if(is_array($data['LANGNAMES']))
$data['LANGNAMES'] = serialize($data['LANGNAMES']);
if(is_array($data['EXTERNALS']))
$data['EXTERNALS'] = serialize($data['EXTERNALS']);
$this->exportOffset++;
$this->inserter->insert($data);
}
public static function getMap()
{
$map = parent::getMap();
$map['ZIP'] = array(
'data_type' => 'string',
);
return $map;
}
*/
public static function getMap()
{
$map = parent::getMap();
$map['ZIP'] = array(
'data_type' => 'string',
);
$map['ZIP_TO'] = array(
'data_type' => 'string',
);
return $map;
}
}