Created
October 8, 2019 11:45
-
-
Save livevasiliy/d8fd9416a671ac79f90c4556af7d5852 to your computer and use it in GitHub Desktop.
Импорт товаров с торговыми предложениями из CSV файла на 1С Bitrix Framework.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use \Bitrix\HighLoadblock as HL; | |
use \Bitrix\Main\Loader; | |
use \Bitrix\Main\SystemException; | |
use \Bitrix\Main\ObjectPropertyException; | |
define('CATALOG_IBLOCK_ID', 17); // ID Инфоблока Каталога. | |
define('SKU_CATALOG_IBLOCK_ID', 20); // ID Инфоблока Торговые предложения. | |
define('BRAND_IBLOCK_ID', 12); // ID Инфоблока Бренды. | |
define('CSV_FILE_PATH', $_SERVER['DOCUMENT_ROOT'] . "/csv/test-case.csv"); // Путь до файла CSV. | |
function fprint_r ($array) | |
{ | |
echo "<pre>"; | |
print_r($array); | |
echo "</pre>"; | |
} | |
/** | |
* Возвращает массив значении. | |
* | |
* @param $iblockID | |
* @param $searchItem | |
* | |
* @return array | |
*/ | |
function getPropertyValue($iblockID, $searchItem) | |
{ | |
$result = array(); | |
$rsElement = CIBlockElement::GetList( | |
$arOrder = array('SORT' => 'ASC'), | |
$arFilter = array( | |
'ACTIVE' => 'Y', | |
'IBLOCK_ID' => $iblockID, | |
'NAME' => $searchItem | |
), | |
false, | |
false, | |
$arSelectFields = array('ID', 'NAME') | |
); | |
while($arElement = $rsElement->fetch()) { | |
array_push($result, $arElement); | |
} | |
return $result; | |
} | |
/** | |
* Возвращает ID значения в списке | |
* | |
* @param string $code | |
* @param int $iblockID | |
* @param $searchItem | |
* | |
* @return mixed | |
*/ | |
function getEnumValue($code = '', $iblockID, $searchItem) | |
{ | |
$enumValues = CIBlockPropertyEnum::GetList( | |
array('DEF' => 'DESC', 'SORT' => 'ASC'), | |
array('IBLOCK_ID' => $iblockID, 'CODE' => $code) | |
); | |
$enumValue = array(); | |
while ($value = $enumValues->GetNext()) | |
{ | |
$enumValue[$value['ID']] = $value['VALUE']; | |
} | |
if (empty($enumValue)) | |
{ | |
echo 'Значении в списке нету'; | |
return; | |
} | |
if ($searchValue = array_search($searchItem, $enumValue)) | |
{ | |
return $searchValue; | |
} | |
} | |
/** | |
* Возвращает Id элемента из выборки полученная GetList | |
* | |
* @param array $data | |
* | |
* @return int $brandId | |
*/ | |
function getBrandId(array $data) | |
{ | |
$brandId = null; | |
if (!empty($data)) | |
{ | |
foreach ($data as $key => $value) { | |
$brandId = $value['ID']; | |
} | |
} | |
return $brandId; | |
} | |
/** | |
* Получаем список ID товаров по артиклу. | |
* | |
* @param mixed $iblockID | |
* @param mixed $articles | |
* | |
* @return array | |
*/ | |
function getProductByArticle($iblockId, $articles) | |
{ | |
$result = array(); | |
$rsElement = CIBlockElement::GetList( | |
$arOrder = array('SORT' => 'ASC'), | |
$arFilter = array( | |
'ACTIVE' => 'Y', | |
'IBLOCK_ID' => $iblockID, | |
'PROPERTY_CML2_ARTICLE' => $articles | |
), | |
false, | |
false, | |
$arSelectFields = array('ID', 'NAME') | |
); | |
while($arElement = $rsElement->fetch()) | |
{ | |
array_push($result, $arElement['ID']); | |
} | |
return $result; | |
} | |
function importCSVToCatalog() | |
{ | |
try | |
{ | |
Loader::includeModule('iblock'); | |
Loader::includeModule('catalog'); | |
Loader::includeModule('sale'); | |
Loader::includeModule('highloadblock'); | |
$sections = array(); | |
$products = array(); | |
$items = array(); | |
$iblockElementDB = new CIBlockElement; | |
$sectionsDB = CIBlockSection::GetList( | |
array(), | |
array( | |
'ACTIVE' => 'Y', | |
'GLOBAL_ACTIVE' => 'Y', | |
'IBLOCK_ID' => CATALOG_IBLOCK_ID, | |
), | |
false, | |
array('ID', 'NAME') | |
); | |
while ($arSection = $sectionsDB->GetNext()) | |
{ | |
$sections[$arSection['ID']] = $arSection['NAME']; | |
} | |
if (count($sections) === 0) | |
{ | |
echo "Нет разделов."; | |
return; | |
} | |
// Получили список всех товаров в каталоге | |
$rsElement = CIBlockElement::GetList( | |
$arOrder = array("SORT" => "ASC"), | |
$arFilter = array( | |
"ACTIVE" => "Y", | |
"IBLOCK_ID" => CATALOG_IBLOCK_ID | |
), | |
false, | |
false, | |
$arSelectFields = array("ID", "NAME", "IBLOCK_ID", "CODE", "PROPERTY_CML2_ARTICLE") | |
); | |
while($arElement = $rsElement->fetch()) | |
{ | |
$products[$arElement['ID']] = $arElement['NAME']; | |
} | |
if (count($products) == 0) | |
{ | |
echo 'Товаров нет'; | |
die(); | |
} | |
$strings = file(CSV_FILE_PATH); | |
unset($strings[0]); // убрать названия столбцов | |
foreach ($strings as $string) | |
{ | |
$items[] = explode(';', $string); | |
} | |
foreach ($items as $key => $item) | |
{ | |
if ($sectionID = array_search($item[1], $sections)) | |
{ | |
$res = CIBlockElement::GetList( | |
array(), | |
array('IBLOCK_ID' => CATALOG_IBLOCK_ID, 'NAME' => $item[2]) | |
); | |
// Если не нашли, продолжаем. | |
if ($res->SelectedRowsCount() < 0) | |
{ | |
continue; | |
} | |
// Св-ва для добавления нового товара | |
$PROPERTY_VALUES = array( | |
'CML2_ARTICLE' => $item[0], | |
'IN_STOCK' => getEnumValue('IN_STOCK', CATALOG_IBLOCK_ID, $item[5] == 1 ? 'Y' : null), | |
'TYPE' => $item[9], | |
'VIEW' => $item[10], | |
'HIT' => getEnumValue('HIT', CATALOG_IBLOCK_ID, $item[7] == 1 ? 'Новинка' : null), | |
'SIZES' => getEnumValue('SIZES', CATALOG_IBLOCK_ID, $item[12]), | |
'BRAND' => getBrandId(getPropertyValue(BRAND_IBLOCK_ID, $item[11])), | |
'GOST' => $item[13], | |
'TIP_PRIVYAZI' => getEnumValue('TIP_PRIVYAZI', CATALOG_IBLOCK_ID, $item[14]), | |
'POINT_MOUNT' => $item[15], | |
'ADD_PROPERTIES' => $item[16], | |
'RECOMENDATION' => getProductByArticle(CATALOG_IBLOCK_ID, array($item[17])), | |
'LEASH_LINK' => $item[18], | |
'MATERIAL_POINT_MOUNT' => $item[19], | |
'BUCKLE_TYPE' => $item[21], | |
'PROD_MATERIAL' => $item[22], | |
'DIAMETER' => $item[23], | |
'COUNT_STRANDS' => $item[24], | |
'AMOR_JERK' => $item[25], | |
'COUNT_WORK_LOOPS' => $item[26], | |
'CARABINE_DISCLOSURE' => $item[27], | |
'SPECIAL_USE' => $item[28], | |
'KIND_OF_ROPE' => $item[29], | |
'ROPE_TYPE' => $item[30], | |
'CE_CERFICATE' => $item[31] | |
); | |
// Формируем массив полей, для создания нового товара. | |
$arFields = array( | |
'IBLOCK_ID' => CATALOG_IBLOCK_ID, | |
'IBLOCK_SECTION_ID' => $sectionID, | |
'CODE' => CUtil::translit($item[2], 'ru', array('replace_space'=>'-','replace_other'=>'-')), | |
'NAME' => $item[2], | |
'ACTIVE' => $item[6] == 0 ? 'Y' : 'N', | |
'DETAIL_TEXT' => $item[8], | |
'DETAIL_TEXT_TYPE' => 'html', | |
'PROPERTY_VALUES' => $PROPERTY_VALUES | |
); | |
$newElementID = $iblockElementDB->Add($arFields); | |
if ($newElementID) | |
{ | |
foreach ($items as $item) | |
{ | |
// Рекомендованные товары. | |
$recomendationProducts = array(); | |
$recomendationProducts = array_search($item[17], $products); | |
// Добавляем SKU | |
$arLoadProductArray = array( | |
'IBLOCK_ID' => SKU_CATALOG_IBLOCK_ID, | |
'IBLOCK_SECTION_ID' => $sectionID, | |
'CODE' => CUtil::translit($item[2], 'ru', array('replace_space'=>'-','replace_other'=>'-')), | |
'NAME' => $item[2], | |
'ACTIVE' => $item[6] == 0 ? 'Y' : 'N', | |
'DETAIL_TEXT' => $item[8], | |
'DETAIL_TEXT_TYPE' => 'html', | |
'PROPERTY_VALUES' => array( | |
'ARTICLE' => $item[0], | |
'CML2_LINK' => $newElementID, | |
'IN_STOCK' => $item[5] == 1 ? 100 : null, | |
'TYPE' => $item[9], | |
'VIEW' => $item[10], | |
'HIT' => $item[7] == 1 ? 103 : null, | |
'SIZES' => getEnumValue('SIZES', SKU_CATALOG_IBLOCK_ID, $item[12]), | |
'BRAND' => getBrandId(getPropertyValue(BRAND_IBLOCK_ID, $item[11])), | |
'GOST' => $item[13], | |
'TIP_PRIVYAZI' => getEnumValue('TIP_PRIVYAZI', SKU_CATALOG_IBLOCK_ID, $item[14]), | |
'POINT_MOUNT' => $item[15], | |
'ADD_PROPERTIES' => $item[16], | |
'RECOMENDATION' => getProductByArticle(SKU_CATALOG_IBLOCK_ID, array($item[17])), | |
'LEASH_LINK' => $item[18], | |
'MATERIAL_POINT_MOUNT' => $item[19], | |
'BUCKLE_TYPE' => $item[21], | |
'PROD_MATERIAL' => $item[22], | |
'DIAMETER' => $item[23], | |
'COUNT_STRANDS' => $item[24], | |
'AMOR_JERK' => $item[25], | |
'COUNT_WORK_LOOPS' => $item[26], | |
'CARABINE_DISCLOSURE' => $item[27], | |
'SPECIAL_USE' => $item[28], | |
'KIND_OF_ROPE' => $item[29], | |
'ROPE_TYPE' => $item[30], | |
'CE_CERFICATE' => $item[31] | |
) | |
); | |
$productOfferId = $iblockElementDB->Add($arLoadProductArray); | |
if ($productOfferId) | |
{ | |
CCatalogProduct::Add( | |
array( | |
'ID' => $productOfferId, | |
'QUANTITY' => 9999 | |
) | |
); | |
$priceDB = new CPrice; | |
$priceDB->Add([ | |
'PRODUCT_ID' => $productOfferId, | |
'CATALOG_GROUP_ID' => 1, | |
'PRICE' => $item[3], | |
'CURRENCY' => 'RUB' | |
]); | |
echo 'ТП'. $productOfferId . '- Успешно добавлено<br/>'; | |
} | |
} | |
echo $item[2] . " - Успешно<br>"; | |
} | |
else | |
{ | |
echo $iblockElementDB->LAST_ERROR; | |
die(); | |
} | |
break; | |
} | |
else | |
{ | |
echo $item[1] . " - Раздел не найден. Пропускаю<br>"; | |
} | |
} | |
} | |
catch (LoaderException $e) | |
{ | |
ShowError($e->getMessage()); | |
} | |
catch (ObjectPropertyException $e) | |
{ | |
ShowError($e->getMessage()); | |
} | |
catch (SystemException $e) | |
{ | |
ShowError($e->getMessage()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment