91if (defined(
"CATALOG_LOAD_NO_STEP") && CATALOG_LOAD_NO_STEP)
100if (!function_exists(
'CSVCheckTimeout'))
110if ($URL_DATA_FILE <>
'')
112 $URL_DATA_FILE =
Rel2Abs(
"/", $URL_DATA_FILE);
113 if (file_exists(
$_SERVER[
"DOCUMENT_ROOT"].$URL_DATA_FILE) && is_file(
$_SERVER[
"DOCUMENT_ROOT"].$URL_DATA_FILE))
138 $bIBlockIsCatalog =
false;
145 array(
'IBLOCK_ID',
'PRODUCT_IBLOCK_ID',
'SKU_PROPERTY_ID')
149 $bIBlockIsCatalog =
true;
162 if ($fields_type!=
"F" && $fields_type!=
"R")
168 $arDataFileFields =
array();
169 $fields_type = (($fields_type==
"F") ?
"F" :
"R" );
171 $csvFile->SetFieldsType($fields_type);
173 if ($fields_type ==
"R")
175 $first_names_r = (($first_names_r==
"Y") ?
"Y" :
"N" );
176 $csvFile->SetFirstHeader(($first_names_r==
"Y") ?
true :
false);
178 $delimiter_r_char =
"";
179 switch ($delimiter_r)
182 $delimiter_r_char =
"\t";
185 $delimiter_r_char =
",";
188 $delimiter_r_char =
" ";
191 $delimiter_r_char = mb_substr($delimiter_other_r, 0, 1);
194 $delimiter_r_char =
";";
198 if (mb_strlen($delimiter_r_char) != 1)
202 $csvFile->SetDelimiter($delimiter_r_char);
206 $first_names_f = (($first_names_f==
"Y") ?
"Y" :
"N" );
207 $csvFile->SetFirstHeader(($first_names_f==
"Y") ?
true :
false);
214 $arMetkiTmp = preg_split(
"/[\D]/i", $metki_f);
217 for (
$i = 0, $intCount =
count($arMetkiTmp);
$i < $intCount;
$i++)
219 if (intval($arMetkiTmp[
$i]) > 0)
221 $arMetki[] = intval($arMetkiTmp[
$i]);
225 if (!is_array($arMetki) ||
count($arMetki)<1)
229 $csvFile->SetWidthMap($arMetki);
235 $bFirstHeaderTmp = $csvFile->GetFirstHeader();
236 $csvFile->SetFirstHeader(
false);
237 if (
$arRes = $csvFile->Fetch())
249 $NUM_FIELDS =
count($arDataFileFields);
255 $bFieldsPres =
false;
256 for (
$i = 0;
$i < $NUM_FIELDS;
$i++)
258 if (${
"field_".$i} <>
'')
273 $boolOutTranslit =
false;
274 if (isset(
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE']))
276 if (
'Y' ==
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION']
277 &&
'Y' ==
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'][
'USE_GOOGLE'])
279 $boolOutTranslit =
true;
282 if (isset(
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
284 if (
'Y' ==
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION']
285 &&
'Y' ==
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'USE_GOOGLE'])
287 $boolOutTranslit =
true;
290 if ($boolOutTranslit)
298 $TRANSLIT_LANG = (isset($TRANSLIT_LANG) ? strval($TRANSLIT_LANG) :
'');
299 if (!empty($TRANSLIT_LANG))
302 if (!($arTransLang = $rsTransLangs->Fetch()))
307 if (empty($TRANSLIT_LANG))
313 $updateTranslit =
false;
316 $updateTranslit =
true;
317 if (isset($USE_UPDATE_TRANSLIT) && $USE_UPDATE_TRANSLIT ==
'N')
318 $updateTranslit =
false;
330 $currentUserID =
$USER->GetID();
333 $arDisableFields =
array(
334 'CP_QUANTITY' =>
true,
335 'CP_PURCHASING_PRICE' =>
true,
336 'CP_PURCHASING_CURRENCY' =>
true,
339 $arProductCache =
array();
340 $arPropertyListCache =
array();
341 $arSectionCache =
array();
342 $arElementCache =
array();
344 $productPriceCache =
array();
345 $processedProductPriceCache =
array();
347 $csvFile->SetPos($CUR_FILE_POS);
348 $arRes = $csvFile->Fetch();
349 if ($CUR_FILE_POS<=0 && $bFirstHeaderTmp)
351 $arRes = $csvFile->Fetch();
354 $bs =
new CIBlockSection();
355 $el =
new CIBlockElement();
356 $bWasIterations =
false;
358 $defaultMeasureId =
null;
359 $measure = CCatalogMeasure::getDefaultMeasure();
360 if (!empty($measure))
362 if ($measure[
'ID'] > 0)
363 $defaultMeasureId = $measure[
'ID'];
371 $bWasIterations =
true;
374 $tmpid = md5(uniqid(
""));
380 $arIBlockProperty =
array();
381 $arIBlockPropertyValue =
array();
382 $multiplePropertyValuesCheck =
array();
383 $bThereIsGroups =
false;
384 $bDeactivationStarted =
false;
385 $arProductGroups =
array();
386 $currentProductSection = [];
390 $boolTranslitElement =
false;
392 $boolTranslitSection =
false;
393 $arTranslitElement =
array();
394 $arTranslitSection =
array();
397 if (isset(
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE']))
399 $arTransSettings =
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'];
400 $boolTranslitElement = ($arTransSettings[
'TRANSLITERATION'] ==
'Y');
401 $arTranslitElement =
array(
402 "max_len" => $arTransSettings[
'TRANS_LEN'],
403 "change_case" => $arTransSettings[
'TRANS_CASE'],
404 "replace_space" => $arTransSettings[
'TRANS_SPACE'],
405 "replace_other" => $arTransSettings[
'TRANS_OTHER'],
406 "delete_repeat_replace" => ($arTransSettings[
'TRANS_EAT'] ==
'Y'),
409 if (isset(
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
411 $arTransSettings =
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'];
412 $boolTranslitSection = ($arTransSettings[
'TRANSLITERATION'] ==
'Y');
413 $arTranslitSection =
array(
414 "max_len" => $arTransSettings[
'TRANS_LEN'],
415 "change_case" => $arTransSettings[
'TRANS_CASE'],
416 "replace_space" => $arTransSettings[
'TRANS_SPACE'],
417 "replace_other" => $arTransSettings[
'TRANS_OTHER'],
418 "delete_repeat_replace" => ($arTransSettings[
'TRANS_EAT'] ==
'Y'),
425 $arAvailGroupFields = explode(
",", $strAvailGroupFields);
426 $arAvailGroupFields_names =
array();
429 for ($j = 0; $j < $intCount2; $j++)
433 $arAvailGroupFields_names[$arAvailGroupFields[
$i]] =
array(
444 $arAvailProdFields = explode(
",", $strAvailProdFields);
445 $arAvailProdFields_names =
array();
448 for ($j = 0; $j < $intCount2; $j++)
452 $arAvailProdFields_names[$arAvailProdFields[
$i]] =
array(
463 $arAvailPriceFields = explode(
",", $strAvailPriceFields);
464 $arAvailPriceFields_names =
array();
467 if ($boolUseStoreControl && array_key_exists($arAvailPriceFields[
$i], $arDisableFields))
470 for ($j = 0; $j < $intCount2; $j++)
474 $arAvailPriceFields_names[$arAvailPriceFields[
$i]] =
array(
485 $arAvailValueFields = explode(
",", $strAvailValueFields);
486 $arAvailValueFields_names =
array();
489 for ($j = 0; $j < $intCount2; $j++)
493 $arAvailValueFields_names[$arAvailValueFields[
$i]] =
array(
503 $previousProductId =
false;
504 $updateFacet =
false;
505 $newProducts =
array();
506 CIBlock::disableClearTagCache();
514 $arGroupsTmp =
array();
518 $arGroupsTmp1 =
array();
519 foreach ($arAvailGroupFields_names as
$key => $value)
522 for ($i_tmp = 0; $i_tmp < $NUM_FIELDS; $i_tmp++)
524 if (${
"field_".$i_tmp} ==
$key.$i)
533 $arGroupsTmp1[$value[
"field"]] = trim(
$arRes[$ind]);
534 $bThereIsGroups =
true;
537 $arGroupsTmp[] = $arGroupsTmp1;
543 foreach ($arAvailGroupFields_names as
$key => $value)
545 if ($value[
"important"]==
"Y" && isset($arGroupsTmp[
$i][$value[
"field"]]) &&
'' !== $arGroupsTmp[
$i][$value[
"field"]])
550 unset($arGroupsTmp[
$i]);
554 for (
$i = 0, $intCount =
count($arGroupsTmp);
$i < $intCount;
$i++)
556 if (isset($arGroupsTmp[
$i][
'NAME']) &&
'' === $arGroupsTmp[
$i][
"NAME"])
560 $arGroupsTmp[
$i][
"TMP_ID"] = $tmpid;
563 $LAST_GROUP_CODE = 0;
565 for (
$i = 0, $intCount =
count($arGroupsTmp);
$i < $intCount;
$i++)
569 if (isset($arGroupsTmp[
$i][
"XML_ID"]) &&
'' !== $arGroupsTmp[
$i][
"XML_ID"])
572 $sectionFilter =
'XML'.md5($arGroupsTmp[
$i][
"XML_ID"]);
574 elseif (isset($arGroupsTmp[
$i][
"NAME"]) &&
'' !== $arGroupsTmp[
$i][
"NAME"])
577 $sectionFilter =
'NAME'.md5($arGroupsTmp[
$i][
"NAME"]);
580 if ($LAST_GROUP_CODE>0)
582 $arFilter[
"SECTION_ID"] = $LAST_GROUP_CODE;
583 $arGroupsTmp[
$i][
"IBLOCK_SECTION_ID"] = $LAST_GROUP_CODE;
588 $arGroupsTmp[
$i][
"IBLOCK_SECTION_ID"] =
false;
590 $sectionKey .= $LAST_GROUP_CODE.
':';
591 $sectionIndex = $sectionKey.$sectionFilter;
592 if (!isset($arSectionCache[$sectionIndex]))
594 if (isset($arGroupsTmp[
$i][
"PICTURE"]))
596 $arGroupsTmp[
$i][
"PICTURE"] = trim($arGroupsTmp[
$i][
"PICTURE"]);
598 if (
'' !== $arGroupsTmp[
$i][
"PICTURE"])
600 if (preg_match(
"/^(ftp|ftps|http|https):\\/\\//", $arGroupsTmp[
$i][
"PICTURE"]))
602 $arGroupsTmp[
$i][
"PICTURE"] = CFile::MakeFileArray($arGroupsTmp[
$i][
"PICTURE"]);
606 $arGroupsTmp[
$i][
"PICTURE"] = CFile::MakeFileArray(
$io->GetPhysicalName(
$_SERVER[
"DOCUMENT_ROOT"].$PATH2IMAGE_FILES.
"/".$arGroupsTmp[
$i][
"PICTURE"]));
607 if (!empty($arGroupsTmp[
$i][
"PICTURE"]) && is_array($arGroupsTmp[
$i][
"PICTURE"]))
608 $arGroupsTmp[
$i][
"PICTURE"][
'COPY_FILE'] =
'Y';
610 $bFilePres = (!empty($arGroupsTmp[
$i][
"PICTURE"])
611 && isset($arGroupsTmp[
$i][
"PICTURE"][
"tmp_name"])
612 &&
'' !== $arGroupsTmp[
$i][
"PICTURE"][
"tmp_name"]
616 unset($arGroupsTmp[
$i][
"PICTURE"]);
618 if (isset($arGroupsTmp[
$i][
"DETAIL_PICTURE"]))
620 $arGroupsTmp[
$i][
"DETAIL_PICTURE"] = trim($arGroupsTmp[
$i][
"DETAIL_PICTURE"]);
622 if (
'' !== $arGroupsTmp[
$i][
"DETAIL_PICTURE"])
624 if (preg_match(
"/^(ftp|ftps|http|https):\\/\\//", $arGroupsTmp[
$i][
"DETAIL_PICTURE"]))
626 $arGroupsTmp[
$i][
"DETAIL_PICTURE"] = CFile::MakeFileArray($arGroupsTmp[
$i][
"DETAIL_PICTURE"]);
630 $arGroupsTmp[
$i][
"DETAIL_PICTURE"] = CFile::MakeFileArray(
$io->GetPhysicalName(
$_SERVER[
"DOCUMENT_ROOT"].$PATH2IMAGE_FILES.
"/".$arGroupsTmp[
$i][
"DETAIL_PICTURE"]));
631 if (!empty($arGroupsTmp[
$i][
"DETAIL_PICTURE"]) && is_array($arGroupsTmp[
$i][
"DETAIL_PICTURE"]))
632 $arGroupsTmp[
$i][
"DETAIL_PICTURE"][
'COPY_FILE'] =
'Y';
634 $bFilePres = (!empty($arGroupsTmp[
$i][
"DETAIL_PICTURE"])
635 && isset($arGroupsTmp[
$i][
"DETAIL_PICTURE"][
"tmp_name"])
636 &&
'' !== $arGroupsTmp[
$i][
"DETAIL_PICTURE"][
"tmp_name"]
640 unset($arGroupsTmp[
$i][
"DETAIL_PICTURE"]);
646 if ($boolTranslitSection && $updateTranslit)
648 if (!isset($arGroupsTmp[
$i][
'CODE']) ||
'' === $arGroupsTmp[
$i][
'CODE'])
650 $arGroupsTmp[
$i][
'CODE'] = CUtil::translit($arGroupsTmp[
$i][
"NAME"], $TRANSLIT_LANG, $arTranslitSection);
653 $LAST_GROUP_CODE =
$arr[
"ID"];
657 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".
GetMessage(
"CATI_ERR_UPDATE_SECT").
" ".$bs->LAST_ERROR.
"<br>";
662 if ($boolTranslitSection)
664 if (!isset($arGroupsTmp[
$i][
'CODE']) ||
'' === $arGroupsTmp[
$i][
'CODE'])
666 $arGroupsTmp[
$i][
'CODE'] = CUtil::translit($arGroupsTmp[
$i][
"NAME"], $TRANSLIT_LANG, $arTranslitSection);
670 $arGroupsTmp[
$i][
"ACTIVE"] = (isset($arGroupsTmp[
$i][
"ACTIVE"]) &&
'N' === $arGroupsTmp[
$i][
"ACTIVE"] ?
'N' :
'Y');
671 $LAST_GROUP_CODE = $bs->Add($arGroupsTmp[
$i],
true,
true,
'Y' ===
$IMAGE_RESIZE);
672 if (!$LAST_GROUP_CODE)
674 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".
GetMessage(
"CATI_ERR_ADD_SECT").
" ".$bs->LAST_ERROR.
"<br>";
678 if (
'' === $strErrorR)
680 $arSectionCache[$sectionIndex] = $LAST_GROUP_CODE;
685 $LAST_GROUP_CODE = $arSectionCache[$sectionIndex];
690 if (
'' === $strErrorR)
692 $arLoadProductArray =
array(
693 "MODIFIED_BY" => $currentUserID,
697 foreach ($arAvailProdFields_names as
$key => $value)
700 for ($i_tmp = 0; $i_tmp < $NUM_FIELDS; $i_tmp++)
702 if (${
"field_".$i_tmp} ==
$key)
711 $arLoadProductArray[$value[
"field"]] = trim(
$arRes[$ind]);
715 if (isset($arLoadProductArray[
"XML_ID"]) &&
'' !== $arLoadProductArray[
"XML_ID"])
717 $arFilter[
"=XML_ID"] = $arLoadProductArray[
"XML_ID"];
721 if (isset($arLoadProductArray[
"NAME"]) &&
'' !== $arLoadProductArray[
"NAME"])
723 $arFilter[
"=NAME"] = $arLoadProductArray[
"NAME"];
732 if (
'' === $strErrorR)
734 if (isset($arLoadProductArray[
"PREVIEW_PICTURE"]))
736 $arLoadProductArray[
"PREVIEW_PICTURE"] = trim($arLoadProductArray[
"PREVIEW_PICTURE"]);
738 if (
'' !== $arLoadProductArray[
"PREVIEW_PICTURE"])
740 if (preg_match(
"/^(ftp|ftps|http|https):\\/\\//", $arLoadProductArray[
"PREVIEW_PICTURE"]))
742 $arLoadProductArray[
"PREVIEW_PICTURE"] = CFile::MakeFileArray($arLoadProductArray[
"PREVIEW_PICTURE"]);
746 $arLoadProductArray[
"PREVIEW_PICTURE"] = CFile::MakeFileArray(
$io->GetPhysicalName(
$_SERVER[
"DOCUMENT_ROOT"].$PATH2IMAGE_FILES.
"/".$arLoadProductArray[
"PREVIEW_PICTURE"]));
747 if (!empty($arLoadProductArray[
"PREVIEW_PICTURE"]) && is_array($arLoadProductArray[
"PREVIEW_PICTURE"]))
748 $arLoadProductArray[
"PREVIEW_PICTURE"][
"COPY_FILE"] =
"Y";
750 $bFilePres = (!empty($arLoadProductArray[
"PREVIEW_PICTURE"])
751 && isset($arLoadProductArray[
"PREVIEW_PICTURE"][
"tmp_name"])
752 &&
'' !== $arLoadProductArray[
"PREVIEW_PICTURE"][
"tmp_name"]
756 unset($arLoadProductArray[
"PREVIEW_PICTURE"]);
759 if (isset($arLoadProductArray[
"DETAIL_PICTURE"]))
761 $arLoadProductArray[
"DETAIL_PICTURE"] = trim($arLoadProductArray[
"DETAIL_PICTURE"]);
763 if (
'' !== $arLoadProductArray[
"DETAIL_PICTURE"])
765 if (preg_match(
"/^(ftp|ftps|http|https):\\/\\//", $arLoadProductArray[
"DETAIL_PICTURE"]))
767 $arLoadProductArray[
"DETAIL_PICTURE"] = CFile::MakeFileArray($arLoadProductArray[
"DETAIL_PICTURE"]);
771 $arLoadProductArray[
"DETAIL_PICTURE"] = CFile::MakeFileArray(
$io->GetPhysicalName(
$_SERVER[
"DOCUMENT_ROOT"].$PATH2IMAGE_FILES.
"/".$arLoadProductArray[
"DETAIL_PICTURE"]));
772 if (!empty($arLoadProductArray[
"DETAIL_PICTURE"]) && is_array($arLoadProductArray[
"DETAIL_PICTURE"]))
773 $arLoadProductArray[
"DETAIL_PICTURE"][
"COPY_FILE"] =
"Y";
775 $bFilePres = (!empty($arLoadProductArray[
"DETAIL_PICTURE"])
776 && isset($arLoadProductArray[
"DETAIL_PICTURE"][
"tmp_name"])
777 &&
'' !== $arLoadProductArray[
"DETAIL_PICTURE"][
"tmp_name"]
781 unset($arLoadProductArray[
"DETAIL_PICTURE"]);
784 $res = CIBlockElement::GetList(
789 array(
'ID',
'PREVIEW_PICTURE',
'DETAIL_PICTURE',
'IBLOCK_SECTION_ID')
793 $PRODUCT_ID = (int)
$arr[
'ID'];
794 if (isset($arLoadProductArray[
"PREVIEW_PICTURE"]) && intval(
$arr[
"PREVIEW_PICTURE"])>0)
796 $arLoadProductArray[
"PREVIEW_PICTURE"][
"old_file"] =
$arr[
"PREVIEW_PICTURE"];
798 if (isset($arLoadProductArray[
"DETAIL_PICTURE"]) && intval(
$arr[
"DETAIL_PICTURE"])>0)
800 $arLoadProductArray[
"DETAIL_PICTURE"][
"old_file"] =
$arr[
"DETAIL_PICTURE"];
802 if ($boolTranslitElement && $updateTranslit)
804 if (!isset($arLoadProductArray[
'CODE']) ||
'' === $arLoadProductArray[
'CODE'])
806 $arLoadProductArray[
'CODE'] = CUtil::translit($arLoadProductArray[
"NAME"], $TRANSLIT_LANG, $arTranslitElement);
811 if (!isset($currentProductSection[$PRODUCT_ID]))
812 $currentProductSection[$PRODUCT_ID] =
$arr[
'IBLOCK_SECTION_ID'];
813 $LAST_GROUP_CODE_tmp = (($LAST_GROUP_CODE > 0) ? $LAST_GROUP_CODE :
false);
814 if (!isset($arProductGroups[$PRODUCT_ID]))
815 $arProductGroups[$PRODUCT_ID] =
array();
816 if (!in_array($LAST_GROUP_CODE_tmp, $arProductGroups[$PRODUCT_ID]))
818 $arProductGroups[$PRODUCT_ID][] = $LAST_GROUP_CODE_tmp;
820 $arLoadProductArray[
"IBLOCK_SECTION"] = $arProductGroups[$PRODUCT_ID];
821 $arLoadProductArray[
'IBLOCK_SECTION_ID'] = $currentProductSection[$PRODUCT_ID];
824 $res = $el->Update($PRODUCT_ID, $arLoadProductArray, $bWorkflow,
false,
'Y' ===
$IMAGE_RESIZE);
830 $arLoadProductArray[
"IBLOCK_SECTION"] = (($LAST_GROUP_CODE>0) ? $LAST_GROUP_CODE :
false);
832 if ($arLoadProductArray[
"ACTIVE"] !=
"N")
833 $arLoadProductArray[
"ACTIVE"] =
"Y";
834 if ($boolTranslitElement)
836 if (!isset($arLoadProductArray[
'CODE']) ||
'' === $arLoadProductArray[
'CODE'])
838 $arLoadProductArray[
'CODE'] = CUtil::translit($arLoadProductArray[
"NAME"], $TRANSLIT_LANG, $arTranslitElement);
842 $PRODUCT_ID = $el->Add($arLoadProductArray, $bWorkflow,
false,
'Y' ===
$IMAGE_RESIZE);
845 if (!isset($arProductGroups[$PRODUCT_ID]))
846 $arProductGroups[$PRODUCT_ID] =
array();
847 $arProductGroups[$PRODUCT_ID][] = (($LAST_GROUP_CODE > 0) ? $LAST_GROUP_CODE :
false);
849 $res = ($PRODUCT_ID > 0);
851 $newProducts[$PRODUCT_ID] =
true;
856 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".
GetMessage(
"CATI_ERROR_LOADING").
" ".$el->LAST_ERROR.
"<br>";
860 if (
'' === $strErrorR)
863 for (
$i = 0;
$i < $NUM_FIELDS;
$i++)
865 if (0 == strncmp(${
"field_".$i},
"IP_PROP", 7))
867 $cur_prop_id = intval(mb_substr(${
"field_".$i}, 7));
868 if (!isset($arIBlockProperty[$cur_prop_id]))
870 $res1 = CIBlockProperty::GetByID($cur_prop_id,
$IBLOCK_ID);
871 if ($arRes1 = $res1->Fetch())
872 $arIBlockProperty[$cur_prop_id] = $arRes1;
874 $arIBlockProperty[$cur_prop_id] =
array();
876 if (!empty($arIBlockProperty[$cur_prop_id]) && is_array($arIBlockProperty[$cur_prop_id]))
884 if (!isset($arProductCache[
$arRes[
$i]]))
886 $rsProducts = CIBlockElement::GetList(
893 if ($arParentProduct = $rsProducts->Fetch())
894 $arProductCache[
$arRes[
$i]] = $arParentProduct[
'ID'];
899 elseif ($arIBlockProperty[$cur_prop_id][
"PROPERTY_TYPE"]==
"L")
905 if (!isset($arPropertyListCache[$cur_prop_id]))
907 $arPropertyListCache[$cur_prop_id] =
array();
909 array(
'SORT' =>
'ASC',
'VALUE' =>
'ASC'),
910 array(
'IBLOCK_ID' =>
$IBLOCK_ID,
'PROPERTY_ID' => $arIBlockProperty[$cur_prop_id][
'ID'])
912 while ($propEnumValue = $propEnumRes->Fetch())
913 $arPropertyListCache[$cur_prop_id][md5($propEnumValue[
'VALUE'])] = $propEnumValue[
'ID'];
915 if (!isset($arPropertyListCache[$cur_prop_id][$propValueHash]))
919 "PROPERTY_ID" => $arIBlockProperty[$cur_prop_id][
'ID'],
925 if (isset($arPropertyListCache[$cur_prop_id][$propValueHash]))
927 $arRes[
$i] = $arPropertyListCache[$cur_prop_id][$propValueHash];
935 elseif ($arIBlockProperty[$cur_prop_id][
"PROPERTY_TYPE"]==
"F")
938 if(preg_match(
"/^(ftp|ftps|http|https):\\/\\//",
$arRes[
$i]))
953 if ($arIBlockProperty[$cur_prop_id][
"MULTIPLE"]==
"Y")
955 if (!isset($arIBlockPropertyValue[$PRODUCT_ID]))
957 $arIBlockPropertyValue[$PRODUCT_ID] =
array();
958 $multiplePropertyValuesCheck[$PRODUCT_ID] =
array();
961 !isset($arIBlockPropertyValue[$PRODUCT_ID][$cur_prop_id])
962 || !is_array($arIBlockPropertyValue[$PRODUCT_ID][$cur_prop_id])
965 $arIBlockPropertyValue[$PRODUCT_ID][$cur_prop_id] =
array();
966 $multiplePropertyValuesCheck[$PRODUCT_ID][$cur_prop_id] =
array();
970 !in_array($multipleCheckId, $multiplePropertyValuesCheck[$PRODUCT_ID][$cur_prop_id])
973 $arIBlockPropertyValue[$PRODUCT_ID][$cur_prop_id][] =
$arRes[
$i];
974 $multiplePropertyValuesCheck[$PRODUCT_ID][$cur_prop_id][] = $multipleCheckId;
977 $PROP[$cur_prop_id] = $arIBlockPropertyValue[$PRODUCT_ID][$cur_prop_id];
989 CIBlockElement::SetPropertyValuesEx($PRODUCT_ID,
$IBLOCK_ID, $PROP);
994 if (
'' == $strErrorR && $bIBlockIsCatalog)
996 $arLoadOfferArray =
array(
1000 foreach ($arAvailPriceFields_names as
$key => $value)
1003 for ($i_tmp = 0; $i_tmp < $NUM_FIELDS; $i_tmp++)
1005 if (${
"field_".$i_tmp} ==
$key)
1013 $arLoadOfferArray[$value[
"field"]] = trim(
$arRes[$ind]);
1016 $arLoadOfferArray =
array(
1017 'fields' => $arLoadOfferArray,
1018 'external_fields' =>
array(
1022 $row = Catalog\Model\Product::getList(
array(
1023 'select' =>
array(
'ID'),
1024 'filter' =>
array(
'=ID' => $PRODUCT_ID)
1028 if ($boolUseStoreControl)
1030 $arLoadOfferArray[
'fields'][
'QUANTITY'] = 0;
1031 $arLoadOfferArray[
'fields'][
'QUANTITY_RESERVED'] = 0;
1034 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] =
null;
1035 $arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'] =
null;
1039 if (isset($arLoadOfferArray[
'fields'][
'QUANTITY']) && $arLoadOfferArray[
'fields'][
'QUANTITY'] ===
'')
1040 unset($arLoadOfferArray[
'fields'][
'QUANTITY']);
1041 $emptyStartPrice = (
1043 isset($arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'])
1044 && $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] ===
''
1048 isset($arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'])
1049 && $arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'] ===
''
1052 if ($emptyStartPrice)
1054 unset($arLoadOfferArray[
'fields'][
'PURCHASING_PRICE']);
1055 unset($arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY']);
1057 unset($emptyStartPrice);
1058 if (isset($arLoadOfferArray[
'fields'][
'PURCHASING_PRICE']))
1060 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] = str_replace(
1063 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE']
1067 if (isset($arLoadOfferArray[
'fields'][
'WEIGHT']) && $arLoadOfferArray[
'fields'][
'WEIGHT'] ===
'')
1068 unset($arLoadOfferArray[
'fields'][
'WEIGHT']);
1069 if (empty($arLoadOfferArray[
'fields'][
'MEASURE']) && $defaultMeasureId !==
null)
1070 $arLoadOfferArray[
'fields'][
'MEASURE'] = $defaultMeasureId;
1071 $productResult = Catalog\Model\Product::add($arLoadOfferArray);
1075 if (!$boolUseStoreControl)
1077 if (isset($arLoadOfferArray[
'fields'][
'QUANTITY']) && $arLoadOfferArray[
'fields'][
'QUANTITY'] ===
'')
1078 $arLoadOfferArray[
'fields'][
'QUANTITY'] = 0;
1079 $emptyStartPrice = (
1081 isset($arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'])
1082 && $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] ===
''
1086 isset($arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'])
1087 && $arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'] ===
''
1090 if ($emptyStartPrice)
1092 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] =
null;
1093 $arLoadOfferArray[
'fields'][
'PURCHASING_CURRENCY'] =
null;
1095 unset($emptyStartPrice);
1096 if (isset($arLoadOfferArray[
'fields'][
'PURCHASING_PRICE']))
1098 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE'] = str_replace(
1101 $arLoadOfferArray[
'fields'][
'PURCHASING_PRICE']
1105 if (isset($arLoadOfferArray[
'fields'][
'WEIGHT']) && $arLoadOfferArray[
'fields'][
'WEIGHT'] ===
'')
1106 $arLoadOfferArray[
'fields'][
'WEIGHT'] = 0;
1107 $productResult = Catalog\Model\Product::update($PRODUCT_ID, $arLoadOfferArray);
1110 unset($arLoadOfferArray);
1111 if (!$productResult->isSuccess())
1113 $strErrorR .=
GetMessage(
'CATI_LINE_NO').
' '.$line_num.
'. '.implode(
'; ', $productResult->getErrorMessages());
1119 for ($j = 0; $j < $NUM_FIELDS; $j++)
1121 if (${
"field_".$j} ==
"CV_QUANTITY_FROM")
1122 $quantityFrom = (
int)
$arRes[$j];
1123 elseif (${
"field_".$j} ==
"CV_QUANTITY_TO")
1124 $quantityTo = (
int)
$arRes[$j];
1126 if ($quantityFrom <= 0)
1127 $quantityFrom =
null;
1128 if ($quantityTo <= 0)
1133 for ($j = 0; $j < $NUM_FIELDS; $j++)
1135 foreach ($arAvailValueFields_names as
$key => $value)
1137 if (0 == strncmp(${
"field_".$j},
$key.
"_", $value[
'field_name_size'] + 1))
1139 $strTempKey = intval(mb_substr(${
"field_".$j}, $value[
'field_name_size'] + 1));
1143 "PRODUCT_ID" => $PRODUCT_ID,
1144 "CATALOG_GROUP_ID" => $strTempKey,
1145 "QUANTITY_FROM" => $quantityFrom,
1146 "QUANTITY_TO" => $quantityTo,
1158 if (!isset($productPriceCache[$PRODUCT_ID]))
1160 $productPriceCache[$PRODUCT_ID] =
array();
1161 $priceIterator = Catalog\Model\Price::getList(
array(
1162 'select' =>
array(
'ID',
'CATALOG_GROUP_ID',
'QUANTITY_FROM',
'QUANTITY_TO'),
1165 while ($row = $priceIterator->fetch())
1167 $hash = ($row[
'QUANTITY_FROM'] ===
null ?
'ZERO' : $row[
'QUANTITY_FROM']).
'-'.
1168 ($row[
'QUANTITY_TO'] ===
null ?
'INF' : $row[
'QUANTITY_TO']);
1169 $priceType = (int)$row[
'CATALOG_GROUP_ID'];
1170 if (!isset($productPriceCache[$PRODUCT_ID][$priceType]))
1171 $productPriceCache[$PRODUCT_ID][$priceType] =
array();
1172 $productPriceCache[$PRODUCT_ID][$priceType][
$hash] = (int)$row[
'ID'];
1174 unset($row, $priceIterator);
1181 $hash = ($value[
'QUANTITY_FROM'] ===
null ?
'ZERO' : $value[
'QUANTITY_FROM']).
'-'.
1182 ($value[
'QUANTITY_TO'] ===
null ?
'INF' : $value[
'QUANTITY_TO']);
1183 $priceType = (int)$value[
'CATALOG_GROUP_ID'];
1185 if (!isset($processedProductPriceCache[$PRODUCT_ID][$priceType][
$hash]))
1187 if (!isset($processedProductPriceCache[$PRODUCT_ID]))
1188 $processedProductPriceCache[$PRODUCT_ID] =
array();
1189 if (!isset($processedProductPriceCache[$PRODUCT_ID][$priceType]))
1190 $processedProductPriceCache[$PRODUCT_ID][$priceType] =
array();
1192 $priceId = (isset($productPriceCache[$PRODUCT_ID][$priceType][
$hash])
1193 ? $productPriceCache[$PRODUCT_ID][$priceType][
$hash]
1197 if ($priceId !==
null)
1200 (isset($value[
'PRICE']) &&
'' === $value[
'PRICE']) &&
1201 (isset($value[
'CURRENCY']) &&
'' === $value[
'CURRENCY'])
1204 if ($boolEraseClear)
1206 $priceResult = Catalog\Model\Price::delete($priceId);
1207 if (!$priceResult->isSuccess())
1209 $strPriceErr = implode(
'; ', $priceResult->getErrorMessages());
1210 if ($strPriceErr !==
'')
1211 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE').$strPriceErr;
1213 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE');
1215 unset($priceResult);
1221 if (isset($value[
'PRICE']))
1222 $value[
'PRICE'] = str_replace(
array(
' ',
','),
array(
'',
'.'), $value[
'PRICE']);
1231 $priceResult = Catalog\Model\Price::update($priceId, $value);
1232 if ($priceResult->isSuccess())
1234 $bUpdatePrice =
'Y';
1238 $strPriceErr = implode(
'; ', $priceResult->getErrorMessages());
1239 if ($strPriceErr !==
'')
1240 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_UPDATE').$strPriceErr;
1242 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_UPDATE_UNKNOWN');
1244 unset($priceResult);
1246 unset($productPriceCache[$PRODUCT_ID][$priceType][
$hash]);
1247 $processedProductPriceCache[$PRODUCT_ID][$priceType][
$hash] = $priceId;
1251 $boolEmptyNewPrice = (
1252 (isset($value[
'PRICE']) &&
'' === $value[
'PRICE'])
1253 && (isset($value[
'CURRENCY']) &&
'' === $value[
'CURRENCY'])
1255 if (!$boolEmptyNewPrice)
1257 if (isset($value[
'PRICE']))
1258 $value[
'PRICE'] = str_replace(
array(
' ',
','),
array(
'',
'.'), $value[
'PRICE']);
1260 $priceResult = Catalog\Model\Price::add($value);
1261 if ($priceResult->isSuccess())
1263 $bUpdatePrice =
'Y';
1264 $processedProductPriceCache[$PRODUCT_ID][$priceType][
$hash] = $priceResult->getId();
1268 $strPriceErr = implode(
'; ', $priceResult->getErrorMessages());
1269 if ($strPriceErr !==
'')
1270 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_ADD').$strPriceErr;
1272 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_ADD_UNKNOWN');
1274 unset($priceResult);
1277 if (
'' != $strPriceErr)
1279 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".$strPriceErr.
'<br>';
1284 $updateFacet =
true;
1292 if (
'' == $strErrorR)
1295 if ($previousProductId ===
false)
1296 $previousProductId = $PRODUCT_ID;
1297 if ($previousProductId != $PRODUCT_ID)
1299 CIBlockElement::UpdateSearch($previousProductId,
true);
1300 $ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues(
$IBLOCK_ID, $previousProductId);
1301 $ipropValues->clearValues();
1302 unset($ipropValues);
1305 if (isset($newProducts[$previousProductId]))
1306 CCatalogSKU::ClearCache();
1308 $updateFacet =
false;
1309 if (!empty($productPriceCache[$previousProductId]))
1311 foreach ($productPriceCache[$previousProductId] as $priceTypeRows)
1313 if (!empty($priceTypeRows) && is_array($priceTypeRows))
1315 foreach ($priceTypeRows as $priceId)
1317 $priceResult = Catalog\Model\Price::delete($priceId);
1318 if (!$priceResult->isSuccess())
1320 $strPriceErr = implode(
'; ', $priceResult->getErrorMessages());
1321 if ($strPriceErr !==
'')
1322 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE').$strPriceErr;
1324 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE');
1325 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".$strPriceErr.
'<br>';
1331 unset($productPriceCache[$previousProductId]);
1333 if (!empty($processedProductPriceCache[$previousProductId]))
1334 unset($processedProductPriceCache[$previousProductId]);
1336 if (isset($arIBlockPropertyValue[$previousProductId]))
1338 unset($arIBlockPropertyValue[$previousProductId]);
1340 if (isset($multiplePropertyValuesCheck[$previousProductId]))
1342 unset($multiplePropertyValuesCheck[$previousProductId]);
1344 if (isset($currentProductSection[$previousProductId]))
1346 unset($currentProductSection[$previousProductId]);
1348 if (isset($arProductGroups[$previousProductId]))
1350 unset($arProductGroups[$previousProductId]);
1353 $previousProductId = $PRODUCT_ID;
1364 while (
$arRes = $csvFile->Fetch());
1366 if ($PRODUCT_ID > 0)
1368 CIBlockElement::UpdateSearch($PRODUCT_ID,
true);
1369 $ipropValues = new \Bitrix\Iblock\InheritedProperty\ElementValues(
$IBLOCK_ID, $PRODUCT_ID);
1370 $ipropValues->clearValues();
1371 unset($ipropValues);
1374 if (isset($newProducts[$PRODUCT_ID]))
1375 CCatalogSKU::ClearCache();
1377 $updateFacet =
false;
1379 if (!empty($productPriceCache[$PRODUCT_ID]))
1381 foreach ($productPriceCache[$PRODUCT_ID] as $priceTypeRows)
1383 if (!empty($priceTypeRows) && is_array($priceTypeRows))
1385 foreach ($priceTypeRows as $priceId)
1387 $priceResult = Catalog\Model\Price::delete($priceId);
1388 if (!$priceResult->isSuccess())
1390 $strPriceErr = implode(
'; ', $priceResult->getErrorMessages());
1391 if ($strPriceErr !==
'')
1392 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE').$strPriceErr;
1394 $strPriceErr =
GetMessage(
'CATI_ERR_PRICE_DELETE');
1395 $strErrorR .=
GetMessage(
"CATI_LINE_NO").
" ".$line_num.
". ".$strPriceErr.
'<br>';
1401 unset($productPriceCache[$PRODUCT_ID]);
1403 if (!empty($processedProductPriceCache[$PRODUCT_ID]))
1404 unset($processedProductPriceCache[$PRODUCT_ID]);
1416 if (
$bAllLinesLoaded && $bThereIsGroups && $inFileAction ==
'A' && !$bDeactivationStarted)
1418 $res = CIBlockSection::GetList(
1420 array(
"IBLOCK_ID" =>
$IBLOCK_ID,
"TMP_ID" => $tmpid,
"ACTIVE" =>
"N",
'CHECK_PERMISSIONS' =>
'N'),
1426 $bs->Update(
$arr[
"ID"],
array(
"NAME"=>
$arr[
"NAME"],
"ACTIVE" =>
"Y"));
1436 $res = CIBlockElement::GetList(
1438 array(
"IBLOCK_ID" =>
$IBLOCK_ID,
"TMP_ID" => $tmpid,
"ACTIVE" =>
"N"),
1445 $el->Update(
$arr[
"ID"],
array(
"ACTIVE" =>
"Y"));
1456 if ($outFileAction ==
"D")
1458 $res = CIBlockSection::GetList(
1460 array(
"IBLOCK_ID" =>
$IBLOCK_ID,
"!TMP_ID" => $tmpid,
'CHECK_PERMISSIONS' =>
'N'),
1467 if ($outFileAction==
"D")
1469 CIBlockSection::Delete(
$arr[
"ID"]);
1471 elseif ($outFileAction ==
'H' || $outFileAction ==
'M')
1473 $bDeactivationStarted =
true;
1474 $bs->Update(
$arr[
"ID"],
array(
"NAME"=>
$arr[
"NAME"],
"ACTIVE" =>
"N",
"TMP_ID" => $tmpid));
1480 if ($outFileAction ==
"D")
1491 if ($bIBlockIsCatalog && $outFileAction==
"M")
1494 $arProductArray[
'TMP_ID'] = $tmpid;
1500 $res = Catalog\Model\Product::getList(
array(
1501 'select' =>
array(
'ID'),
1503 'order' =>
array(
'ID' =>
'ASC')
1507 $result = Catalog\Model\Product::update(
$arr[
'ID'], $arProductArray);
1517 $res = CIBlockElement::GetList(
1518 array(
'ID' =>
'ASC'),
1526 if ($outFileAction ==
"D")
1528 CIBlockElement::Delete(
$arr[
"ID"]);
1531 elseif ($outFileAction ==
"H")
1533 $bDeactivationStarted =
true;
1534 $el->Update(
$arr[
"ID"],
array(
"ACTIVE" =>
"N",
"TMP_ID" => $tmpid));
1548 if (
$bAllLinesLoaded && $bIBlockIsCatalog &&
'Y' == $bUpdatePrice && $outFileAction==
"D")
1552 '!=TMP_ID' => $tmpid
1559 $res = Catalog\Model\Price::getList(
array(
1560 'select' =>
array(
'ID'),
1565 $priceResult = Catalog\Model\Price::delete(
$arr[
'ID']);
1576 $bAllDataLoaded =
false;
1579 "tmpid,line_num,correct_lines,"
1580 .
"error_lines,killed_lines,"
1581 .
"arIBlockProperty,arIBlockPropertyValue,"
1582 .
"multiplePropertyValuesCheck,"
1584 .
"bDeactivationStarted,"
1585 .
"arProductGroups,"
1586 .
"currentProductSection,"
1589 $SETUP_VARS_LIST =
"IBLOCK_ID,URL_DATA_FILE,fields_type,first_names_r,delimiter_r,delimiter_other_r,first_names_f,metki_f,PATH2IMAGE_FILES,outFileAction,inFileAction,max_execution_time,IMAGE_RESIZE,USE_TRANSLIT,TRANSLIT_LANG,CLEAR_EMPTY_PRICE,CML2_LINK_IS_XML";
1590 for (
$i = 0;
$i < $NUM_FIELDS;
$i++)
1592 $CUR_FILE_POS = $csvFile->GetPos();
1596 CIBlock::enableClearTagCache();
1603 if (isset($USER_TMP))
static isUsedInventoryManagement()
static enableDeferredCalculation()
static disableDeferredCalculation()
static getDefaultAvailableSettings()
static disableDeferredIndexing()
static runDeferredIndexing($iblockId)
static enableDeferredIndexing()
static getDefaultSettings($type, $extFormat=false)
static getSettingsFields($type, $extFormat=false)
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetList($arOrder=array("SORT"=>"ASC", "VALUE"=>"ASC"), $arFilter=array())
static IncludeModule($module_name)
global $strImportOKMessage
global $strImportErrorMessage
if(!function_exists("file_get_contents")) $DATA_FILE_NAME
if(''===$strImportErrorMessage) if(''===$strImportErrorMessage) $USE_TRANSLIT
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
global $arCatalogAvailPriceFields
global $defCatalogAvailValueFields
global $arCatalogAvailQuantityFields
global $defCatalogAvailProdFields
global $defCatalogAvailQuantityFields
global $arCatalogAvailProdFields
global $defCatalogAvailCurrencies
global $arCatalogAvailGroupFields
global $arCatalogAvailValueFields
global $defCatalogAvailPriceFields
global $defCatalogAvailGroupFields
if(empty($arRunErrors)) $CML2_LINK_IS_XML
if(!file_exists($_SERVER["DOCUMENT_ROOT"]. $strFile)) $bFirstLoadStep
if(false===$arIBlock) if(''==$strImportErrorMessage) if(''==$strImportErrorMessage) if(''==$strImportErrorMessage) if(''==$strImportErrorMessage) $IMAGE_RESIZE
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Rel2Abs($curdir, $relpath)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if(!empty($XML_DATA['PRICE'])) $priceTypeList