Skip to content

Instantly share code, notes, and snippets.

@livevasiliy
Created October 8, 2019 11:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save livevasiliy/d8fd9416a671ac79f90c4556af7d5852 to your computer and use it in GitHub Desktop.
Save livevasiliy/d8fd9416a671ac79f90c4556af7d5852 to your computer and use it in GitHub Desktop.
Импорт товаров с торговыми предложениями из CSV файла на 1С Bitrix Framework.
<?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