- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/location/import/import.php
- Класс: BitrixSaleLocationImportis
- Вызов: is::importFile
static function importFile(&$descriptior)
{
$timeLimit = ini_get('max_execution_time');
if ($timeLimit < $descriptior['TIME_LIMIT']) set_time_limit($descriptior['TIME_LIMIT'] + 5);
$endTime = time() + $descriptior['TIME_LIMIT'];
if($descriptior['STEP'] == 'rebalance')
{
LocationLocationTable::resort();
$descriptior['STEP'] = 'done';
}
if($descriptior['STEP'] == 'import')
{
if(!isset($descriptior['DO_SYNC']))
{
$res = BitrixSaleLocationLocationTable::getList(array('select' => array('CNT')))->fetch();
$descriptior['DO_SYNC'] = intval($res['CNT'] > 0);
}
if(!isset($descriptior['TYPES']))
{
$descriptior['TYPES'] = static::getExistedTypes();
$descriptior['SERVICES'] = static::getExistedServices();
$descriptior['TYPE_MAP'] = static::getTypeMap($descriptior['TYPE_FILE']);
$descriptior['SERVICE_MAP'] = static::getServiceMap($descriptior['SERVICE_FILE']);
}
$csvReader = new CSVReader();
$csvReader->LoadFile($descriptior['FILE']);
while(time() < $endTime)
{
$block = $csvReader->ReadBlockLowLevel($descriptior['POS']/*changed inside*/, 100);
if(!count($block))
break;
foreach($block as $item)
{
if(!isset($descriptior['TYPES'][$item['TYPE_CODE']]))
$descriptior['TYPES'][$item['TYPE_CODE']] = static::createType($descriptior['TYPE_MAP'][$item['TYPE_CODE']]);
if($descriptior['DO_SYNC'])
{
$id = static::checkLocationCodeExists($item['CODE']);
if($id)
{
$descriptior['CODES'][$item['CODE']] = $id;
continue;
}
}
// type
$item['TYPE_ID'] = $descriptior['TYPES'][$item['TYPE_CODE']];
unset($item['TYPE_CODE']);
// parent id
if(strlen($item['PARENT_CODE']))
{
if(!isset($descriptior['CODES'][$item['PARENT_CODE']]))
$descriptior['CODES'][$item['PARENT_CODE']] = static::checkLocationCodeExists($item['PARENT_CODE']);
$item['PARENT_ID'] = $descriptior['CODES'][$item['PARENT_CODE']];
}
unset($item['PARENT_CODE']);
// ext
if(is_array($item['EXT']))
{
foreach($item['EXT'] as $code => $values)
{
if(is_array($values) && !empty($values))
{
if(!isset($descriptior['SERVICES'][$code]))
{
$descriptior['SERVICES'][$code] = static::createService(array(
'CODE' => $code
));
}
foreach($values as $value)
{
if(!strlen($value))
continue;
$item['EXTERNAL'][] = array(
'SERVICE_ID' => $descriptior['SERVICES'][$code],
'XML_ID' => $value
);
}
}
}
}
unset($item['EXT']);
$res = LocationLocationTable::add($item, array('REBALANCE' => false));
if(!$res->isSuccess())
throw new MainSystemException('Cannot create location');
$descriptior['CODES'][$item['CODE']] = $res->getId();
}
}
if(!count($block))
{
unset($descriptior['CODES']);
$descriptior['STEP'] = 'rebalance';
}
}
return $descriptior['STEP'] == 'done';
}