Задача:
Решение:
Теги: d7, импорт, СДЭК
Модуль службы доставки СДЕК для 1С Битрикс грузит местоположения без ZIP-кодов. В результате, для таких местоположений не работает Почта России. Поэтому берем csv-файл с сайта СДЕК, парсим его и устанавливаем индексы для местоположений.
Решение:
1. Берем все местоположения на сайте, у которых: - CODE начинается с "c_" - нет ZIP кода
$parentID = 91; //идентификатор родительского раздела, например, Республика Адыгея (ID = 38)
$csvParentName = 'Крым респ.';
$arLocations = array();
$res = \Bitrix\Sale\Location\LocationTable::getList(array(
'filter' => array(
//'CODE' => array('newly-created-location-code', 'c_'),
'PARENT_ID' => $parentID,
'NAME.LANGUAGE_ID' => 'ru'
),
'select' => array(
'ID',
'CITY_ID',
'CODE',
'PARENT_ID',
'EXTERNAL.*',
'EXTERNAL.SERVICE.CODE',
'LNAME' => 'NAME.NAME'
)
));
$i = 0;
$arParentID = array();
while($item = $res->fetch())
{
if((!strlen($item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID])>0
|| $item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID]==1
|| $item[SALE_LOCATION_LOCATION_EXTERNAL_XML_ID]=='000001')
&& preg_match("#c_#",$item[CODE]))
{
if(strlen($arParentID[$item['PARENT_ID']])>0)
{
$arLocations[$i][ELEMENT] = $item;
$arLocations[$i][PARENT_NAME] = $arParentID[$item['PARENT_ID']];
}
else
{
$arParentLocation =\Bitrix\Sale\Location\LocationTable::getList(array(
'filter' => array(
'NAME.LANGUAGE_ID' => 'ru',
'ID' => $item['PARENT_ID']
),
'select' => array(
'ID',
'CITY_ID',
'CODE',
'PARENT_ID',
'EXTERNAL.*',
'EXTERNAL.SERVICE.CODE',
'LNAME' => 'NAME.NAME',
)
));
if($itemParentLocation = $arParentLocation->fetch())
{
$arLocations[$i][ELEMENT] = $item;
$arLocations[$i][PARENT_NAME] = $itemParentLocation[LNAME];
$arParentID[$item['PARENT_ID']] = $itemParentLocation[LNAME];
}
}
$i++;
}
}
sort($arParentID);
2. Парсим csv-файл и делаем update ZIP-кодов.
Также, если встречаем дубли, удаляем их.
Местоположения идентифицируем по наименованию и наименованию родительского местоположения.
$arSections = array();
$arResult = array();
if (($handle = fopen($_SERVER["DOCUMENT_ROOT"]."/upload/City_RUS_20171125.csv", "r")) !== FALSE) {
$i = 0;
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
{
if($i > 0)
{
if(strlen($data[7])>1 && $data[7]!=1 && $data[7]!='000001')
{
$arResult['ITEMS'][] = $data;
//$arNames - содержит все совпадения по имени
$arNames = array();
foreach($arLocations as $k => $v)
{
if($data[2] == $v[ELEMENT][LNAME] && $data[3]==$csvParentName)
{
$arNames[] = $v;
}
}
if(count($arNames)>1)
{
for($del=1;$del0)
{
$resDel = \Bitrix\Sale\Location\LocationTable::delete($arNames[$del][ELEMENT][ID]);
if($resDel->isSuccess())
{
print('Deleted!');
}
}
}
}
elseif(count($arNames)>0)
{
//Обновляем ZIP-коды
$sp = preg_split("#,#",$data[7]);
$dataUpdate = array(
"PARENT_ID" => $arNames[0][ELEMENT][PARENT_ID]
);
foreach($sp as $ksp => $vsp)
{
$dataUpdate["EXTERNAL"]["n".$ksp] = array(
"SERVICE_ID" => 1, // ID сервиса ZIP
"XML_ID" => $vsp // значение
);
}
$resUpdate = \Bitrix\Sale\Location\LocationTable::update($arNames[0][ELEMENT][ID], $dataUpdate);
if($resUpdate->isSuccess())
{
print('Updated!');
}
else{
print('Error!');
}
}
}
}
$i++;
}
fclose($handle);
}
?>
Теги: d7, импорт, СДЭК