55 global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer;
58 global $oIBlock, $cmlLoadCnts;
61 global $boolIBlockTranslit, $boolTranslitElement, $boolTranslitSection, $arTranslitElement, $arTranslitSection;
69 if (!$dbSite->Fetch())
71 $dbSite = CSite::GetList();
72 $arSite = $dbSite->Fetch();
80 $currentCatalog =
array();
82 if (in_array(
$nameUTF[
"ID"], array_keys($attrs)))
83 $currentCatalog[
"ID"] = $attrs[
$nameUTF[
"ID"]];
84 if (in_array(
$nameUTF[
"Name"], array_keys($attrs)))
85 $currentCatalog[
"Name"] = $attrs[
$nameUTF[
"Name"]];
86 if (in_array(
$nameUTF[
"Description"], array_keys($attrs)))
87 $currentCatalog[
"Description"] = $attrs[
$nameUTF[
"Description"]];
90 $dbIBlockList = CIBlock::GetList(
100 $boolVersion =
false;
106 $currentCatalog[
"BID"] =
$arIBlock[
"ID"];
107 $res = $oIBlock->Update(
108 $currentCatalog[
"BID"],
110 "NAME" => $currentCatalog[
"Name"],
111 "DESCRIPTION" => $currentCatalog[
"Description"]
122 "NAME" => $currentCatalog[
"Name"],
123 "XML_ID" => $currentCatalog[
"ID"],
133 'DEFAULT_VALUE' =>
array(
134 'TRANSLITERATION' =>
'Y',
137 'SECTION_CODE' =>
array(
138 'DEFAULT_VALUE' =>
array(
139 'TRANSLITERATION' =>
'Y',
144 $currentCatalog[
"BID"] = $oIBlock->Add(
$arFields);
145 $res = ($currentCatalog[
"BID"] > 0);
150 $cmlLoadCnts[
"CATALOG"]++;
156 ($boolVersion ? $oIBlock->LAST_ERROR :
GetMessage(
'CML_R_VERSION')),
159 "[".$currentCatalog[
"BID"].
"] \"".$currentCatalog[
"Name"].
"\" (".$currentCatalog[
"ID"].
")",
163 $currentCatalog =
false;
168 $boolTranslitElement =
false;
169 $boolTranslitSection =
false;
170 $arTranslitElement =
array();
171 $arTranslitSection =
array();
173 if (
'Y' == $boolIBlockTranslit)
175 $boolOutTranslit =
false;
176 $arIBlock = CIBlock::GetArrayByID($currentCatalog[
"BID"]);
177 if (isset(
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE']))
179 if (
'Y' ==
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION']
180 &&
'Y' ==
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'][
'USE_GOOGLE'])
182 $boolOutTranslit =
true;
185 if (isset(
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
187 if (
'Y' ==
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION']
188 &&
'Y' ==
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'USE_GOOGLE'])
190 $boolOutTranslit =
true;
193 if ($boolOutTranslit)
195 $boolIBlockTranslit =
'N';
196 $strImportErrorMessage .= str_replace(
"#ERROR#",
GetMessage(
'CATI_USE_CODE_TRANSLIT_OUT'), str_replace(
"#NAME#",
"[".$currentCatalog[
"BID"].
"] \"".$currentCatalog[
"Name"].
"\" (".$currentCatalog[
"ID"].
")", str_replace(
"#ACT#", ($bUpdate ?
GetMessage(
"CML_R_EDIT") :
GetMessage(
"CML_R_ADD")),
GetMessage(
"CML_R_IBLOCK")))).
".<br>";
197 $currentCatalog =
false;
201 if (
'Y' == $boolIBlockTranslit)
203 if (isset(
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE']))
205 $arTransSettings =
$arIBlock[
'FIELDS'][
'CODE'][
'DEFAULT_VALUE'];
206 $boolTranslitElement = (
'Y' == $arTransSettings[
'TRANSLITERATION'] ? true :
false);
207 $arTranslitElement =
array(
208 "max_len" => $arTransSettings[
'TRANS_LEN'],
209 "change_case" => $arTransSettings[
'TRANS_CASE'],
210 "replace_space" => $arTransSettings[
'TRANS_SPACE'],
211 "replace_other" => $arTransSettings[
'TRANS_OTHER'],
212 "delete_repeat_replace" => (
'Y' == $arTransSettings[
'TRANS_EAT'] ?
true :
false),
213 "use_google" => (
'Y' == $arTransSettings[
'USE_GOOGLE'] ?
true :
false),
216 if (isset(
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
218 $arTransSettings =
$arIBlock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'];
219 $boolTranslitSection = (
'Y' == $arTransSettings[
'TRANSLITERATION'] ? true :
false);
220 $arTranslitSection =
array(
221 "max_len" => $arTransSettings[
'TRANS_LEN'],
222 "change_case" => $arTransSettings[
'TRANS_CASE'],
223 "replace_space" => $arTransSettings[
'TRANS_SPACE'],
224 "replace_other" => $arTransSettings[
'TRANS_OTHER'],
225 "delete_repeat_replace" => (
'Y' == $arTransSettings[
'TRANS_EAT'] ?
true :
false),
226 "use_google" => (
'Y' == $arTransSettings[
'USE_GOOGLE'] ?
true :
false),
232 $arIBlockCache[$currentCatalog[
"ID"]] = intval($currentCatalog[
"BID"]);
233 $iBlockIDString .=
",".intval($currentCatalog[
"BID"]);
237 if (function_exists(
"catalog_1c_mutator_catalogT"))
238 catalog_1c_mutator_catalogT($currentCatalog[
"BID"], $bUpdate, $attrs);
246 $currentProperty =
array();
248 $currentProperty[
"ID"] = $attrs[
$nameUTF[
"ID"]];
249 $currentProperty[
"DataType"] = $attrs[
$nameUTF[
"DataType"]];
250 $currentProperty[
"Multiple"] = (($attrs[
$nameUTF[
"Multiple"]] ==
"1" || $attrs[
$nameUTF[
"Multiple"]] ==
"Y") ?
"Y" :
"N");
251 $currentProperty[
"Name"] = $attrs[
$nameUTF[
"Name"]];
252 $currentProperty[
"DefaultValue"] = $attrs[
$nameUTF[
"DefaultValue"]];
254 if ($currentProperty[
"DataType"] ==
"enumeration")
255 $currentProperty[
"DataType"] =
"L";
257 $currentProperty[
"DataType"] =
"S";
260 "INSERT INTO b_catalog_cml_property (XML_ID, CATALOG_ID, DATA_TYPE, MULTIPLE, NAME, DEFAULT_VALUE) ".
261 "VALUES ('".$currentProperty[
"ID"].
"', ".$currentCatalog[
"BID"].
", '".$currentProperty[
"DataType"].
"', '".$currentProperty[
"Multiple"].
"', '".
$DB->ForSql($currentProperty[
"Name"]).
"', '".
$DB->ForSql($currentProperty[
"DefaultValue"]).
"')";
265 $cmlLoadCnts[
"PROPERTY"]++;
270 if ($currentProperty)
272 $currentPropertyEnum =
array();
274 $currentPropertyEnum[
"ID"] = $attrs[
$nameUTF[
"ID"]];
275 $currentPropertyEnum[
"Name"] = $attrs[
$nameUTF[
"Name"]];
276 $currentPropertyEnum[
"Default"] = (($currentProperty[
"DefaultValue"] == $currentPropertyEnum[
"ID"]) ?
"Y" :
"N");
279 "INSERT INTO b_catalog_cml_property_var (XML_ID, CATALOG_ID, PROPERTY_XML_ID, NAME, DEFAULT_VALUE) ".
280 "VALUES ('".$currentPropertyEnum[
"ID"].
"', ".$currentCatalog[
"BID"].
", '".$currentProperty[
"ID"].
"', '".
$DB->ForSql($currentPropertyEnum[
"Name"]).
"', '".$currentPropertyEnum[
"Default"].
"')";
289 $currentCategory =
array();
291 if (in_array(
$nameUTF[
"ID"], array_keys($attrs)))
292 $currentCategory[
"ID"] = $attrs[
$nameUTF[
"ID"]];
293 if (in_array(
$nameUTF[
"Name"], array_keys($attrs)))
294 $currentCategory[
"Name"] = $attrs[
$nameUTF[
"Name"]];
295 if (in_array(
$nameUTF[
"ParentCategory"], array_keys($attrs)))
296 $currentCategory[
"ParentCategory"] = $attrs[
$nameUTF[
"ParentCategory"]];
297 $currentCategory[
"Code"] =
false;
298 if (
true === $boolTranslitSection)
299 $currentCategory[
"Code"] = CUtil::translit($currentCategory[
"Name"],
'ru', $arTranslitSection);
302 "INSERT INTO b_catalog_cml_section (XML_ID, CATALOG_ID, PARENT_XML_ID, NAME, CODE) ".
303 "VALUES ('".$currentCategory[
"ID"].
"', ".$currentCatalog[
"BID"].
", '".$currentCategory[
"ParentCategory"].
"', '".
$DB->ForSql($currentCategory[
"Name"]).
"', '".(
false === $currentCategory[
"Code"] ?
'' :
$DB->ForSql($currentCategory[
"Code"])).
"')";
307 $cmlLoadCnts[
"SECTION"]++;
314 $currentProduct =
array();
315 $currentProduct[
"ID"] = $attrs[
$nameUTF[
"ID"]];
316 $currentProduct[
"Name"] = $attrs[
$nameUTF[
"Name"]];
317 $currentProduct[
"ParentCategory"] = $attrs[
$nameUTF[
"ParentCategory"]];
318 $currentProduct[
"Code"] =
false;
319 if (
true === $boolTranslitElement)
320 $currentProduct[
"Code"] = CUtil::translit($currentProduct[
"Name"],
'ru', $arTranslitElement);
323 "INSERT INTO b_catalog_cml_product (XML_ID, CATALOG_ID, NAME, MODIFIED_BY, PARENT_CATEGORY, CODE) ".
324 "VALUES ('".$currentProduct[
"ID"].
"', ".$currentCatalog[
"BID"].
", '".
$DB->ForSql($currentProduct[
"Name"]).
"', ".((intval(
$USER->GetID()) > 0) ? intval(
$USER->GetID()) : 1).
", '".$currentProduct[
"ParentCategory"].
"', '".(
false === $currentProduct[
"Code"] ?
'' :
$DB->ForSql($currentProduct[
"Code"])).
"')";
328 if (function_exists(
"catalog_1c_mutator_productT"))
329 catalog_1c_mutator_productT($attrs);
331 $cmlLoadCnts[
"PRODUCT"]++;
333 if ($currentProduct[
"ParentCategory"] <>
'')
336 "INSERT INTO b_catalog_cml_product_cat (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID) ".
337 "VALUES (".$currentCatalog[
"BID"].
", '".$currentProduct[
"ID"].
"', '".$currentProduct[
"ParentCategory"].
"')";
348 "INSERT INTO b_catalog_cml_product_cat (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID) ".
349 "VALUES (".$currentCatalog[
"BID"].
", '".$currentProduct[
"ID"].
"', '".$attrs[
$nameUTF[
"IdInCatalog"]].
"')";
358 $propertyID = $attrs[
$nameUTF[
"PropertyId"]];
362 "INSERT INTO b_catalog_cml_product_prop (CATALOG_ID, PRODUCT_XML_ID, PROPERTY_XML_ID, PROPERTY_VALUE, PROPERTY_VALUE_TEXT) ".
367 elseif ($currentOffersList && !$currentOffer)
369 $priceType = $attrs[
$nameUTF[
"Value"]];
370 $currentOffersList[
"PRICE_TYPE"] = $priceType;
373 "INSERT INTO b_catalog_cml_oflist_prop (OFFER_LIST_XML_ID, PROPERTY_VALUE) ".
374 "VALUES (".$currentOffersList[
"ID"].
", '".
$DB->ForSql($priceType, 255).
"')";
381 $currentOffersList =
array();
382 $currentOffersList[
"CatalogID"] = $attrs[
$nameUTF[
"CatalogID"]];
384 if ($currentOffersList[
"Currency"] ==
'')
385 $currentOffersList[
"Currency"] =
"USD";
387 if (!array_key_exists($currentOffersList[
"CatalogID"], $arIBlockCache))
389 $dbIBlockList = CIBlock::GetList(
array(),
array(
"XML_ID" => $currentOffersList[
"CatalogID"]));
391 $arIBlockCache[$currentOffersList[
"CatalogID"]] = intval(
$arIBlock[
"ID"]);
395 "INSERT INTO b_catalog_cml_oflist(CATALOG_ID) ".
396 "VALUES (".$arIBlockCache[$currentOffersList[
"CatalogID"]].
")";
400 $currentOffersList[
"ID"] = intval(
$DB->LastID());
405 if ($currentOffersList)
407 $currentOffer =
array();
408 $currentOffer[
"ProductId"] = $attrs[
$nameUTF[
"ProductId"]];
409 $currentOffer[
"Price"] = DoubleVal(str_replace(
",",
".", $attrs[
$nameUTF[
"Price"]]));
410 $currentOffer[
"Amount"] = intval($attrs[
$nameUTF[
"Amount"]]);
412 if ($currentOffer[
"Currency"] ==
'')
413 $currentOffer[
"Currency"] = $currentOffersList[
"Currency"];
416 "INSERT INTO b_catalog_cml_offer (OFFER_LIST_XML_ID, PRODUCT_XML_ID, PRICE, AMOUNT, CURRENCY) ".
417 "VALUES ('".$currentOffersList[
"ID"].
"', '".$currentOffer[
"ProductId"].
"', ".$currentOffer[
"Price"].
", ".$currentOffer[
"Amount"].
", '".$currentOffer[
"Currency"].
"')";
421 $cmlLoadCnts[
"OFFER"]++;
427 if (isset($attrs[
$nameUTF[
'CommerceInfoVersion']]))
429 $strVersion = (string)$attrs[
$nameUTF[
'CommerceInfoVersion']];
430 if (version_compare($strVersion,
'2.0') >= 0)
434 $currentCatalog =
false;
513 global $cmlTimeMarkTo, $cmlTimeMarkFrom, $cmlTimeMarkGlobalFrom;
514 global $cmlMemoryMarkTo, $cmlMemoryMarkFrom, $cmlMemoryMarkGlobalFrom;
522 if (mb_strtoupper($startStop) ==
"START")
533 elseif (mb_strtoupper($startStop) ==
"STOP")
539 fwrite($hFile, date(
"H:i:s").
" - ".Round($cmlTimeMarkTo - $cmlTimeMarkFrom, 3).
" s - ".($cmlMemoryMarkTo - $cmlMemoryMarkFrom).
" - ".
$text.
"\n");
540 fwrite($hFile, date(
"H:i:s").
" - ".Round($cmlTimeMarkTo - $cmlTimeMarkGlobalFrom, 3).
" s - ".($cmlMemoryMarkTo - $cmlMemoryMarkGlobalFrom).
"\n");
549 fwrite($hFile, date(
"H:i:s").
" - ".Round($cmlTimeMarkTo - $cmlTimeMarkFrom, 3).
" s - ".($cmlMemoryMarkTo - $cmlMemoryMarkFrom).
" - ".($cmlMemoryMarkTo - $cmlMemoryMarkGlobalFrom).
" - ".
$text.
"\n");
582 $arTables =
array(
"b_catalog_cml_tmp",
"b_catalog_cml_property",
"b_catalog_cml_property_var",
"b_catalog_cml_section",
"b_catalog_cml_product",
"b_catalog_cml_product_cat",
"b_catalog_cml_product_prop",
"b_catalog_cml_oflist",
"b_catalog_cml_oflist_prop",
"b_catalog_cml_offer");
587 $arKeys = array_keys(
$arRes);
588 $tableName =
$arRes[$arKeys[0]];
590 if (in_array($tableName, $arTables))
592 foreach ($arTables as
$key => $value)
594 if ($value == $tableName)
596 unset($arTables[
$key]);
603 foreach ($arTables as
$key => $value)
605 if ($value ==
"b_catalog_cml_property")
607 $DB->Query(
"create table b_catalog_cml_property (
608 XML_ID varchar(100) not null,
609 CATALOG_ID int(11) not null,
610 DATA_TYPE char(1) not null,
611 MULTIPLE char(1) not null,
612 NAME varchar(255) not null,
613 DEFAULT_VALUE varchar(255),
614 primary key (CATALOG_ID, XML_ID))");
616 elseif ($value ==
"b_catalog_cml_property_var")
618 $DB->Query(
"create table b_catalog_cml_property_var (
619 XML_ID varchar(100) not null,
620 CATALOG_ID int(11) not null,
621 PROPERTY_XML_ID varchar(100) not null,
622 NAME varchar(255) not null,
623 DEFAULT_VALUE char(1),
624 primary key (CATALOG_ID, PROPERTY_XML_ID, XML_ID))");
626 elseif ($value ==
"b_catalog_cml_section")
628 $DB->Query(
"create table b_catalog_cml_section (
629 XML_ID varchar(100) not null,
630 CATALOG_ID int(11) not null,
631 PARENT_XML_ID varchar(100) not null,
632 NAME varchar(255) not null,
634 primary key (CATALOG_ID, XML_ID))");
636 elseif ($value ==
"b_catalog_cml_product")
638 $DB->Query(
"create table b_catalog_cml_product (
639 XML_ID varchar(100) not null,
640 CATALOG_ID int(11) not null,
641 NAME varchar(255) not null,
642 MODIFIED_BY int(11) not null,
643 PARENT_CATEGORY varchar(100) not null,
645 primary key (CATALOG_ID, XML_ID))");
647 elseif ($value ==
"b_catalog_cml_product_cat")
649 $DB->Query(
"create table b_catalog_cml_product_cat (
650 CATALOG_ID int(11) not null,
651 PRODUCT_XML_ID varchar(100) not null,
652 CATEGORY_XML_ID varchar(100) not null,
653 primary key (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID))");
655 elseif ($value ==
"b_catalog_cml_product_prop")
657 $DB->Query(
"create table b_catalog_cml_product_prop (
658 CATALOG_ID int(11) not null,
659 PRODUCT_XML_ID varchar(100) not null,
660 PROPERTY_XML_ID varchar(100) not null,
661 PROPERTY_VALUE varchar(255) not null,
662 PROPERTY_VALUE_TEXT text,
663 index IXS_CAT_CML_P2P (CATALOG_ID, PROPERTY_XML_ID))");
665 elseif ($value ==
"b_catalog_cml_oflist")
667 $DB->Query(
"create table b_catalog_cml_oflist (
668 ID int(11) not null auto_increment,
669 CATALOG_ID int(11) not null,
671 index IXS_CAT_CML_OL (CATALOG_ID))");
673 elseif ($value ==
"b_catalog_cml_oflist_prop")
675 $DB->Query(
"create table b_catalog_cml_oflist_prop (
676 OFFER_LIST_XML_ID int(11) not null,
677 PROPERTY_VALUE varchar(255) not null,
678 primary key (OFFER_LIST_XML_ID))");
680 elseif ($value ==
"b_catalog_cml_offer")
682 $DB->Query(
"create table b_catalog_cml_offer (
683 OFFER_LIST_XML_ID int(11) not null,
684 PRODUCT_XML_ID varchar(100) not null,
685 PRICE decimal(18,4) not null,
686 AMOUNT int(11) not null,
687 CURRENCY char(3) not null,
688 primary key (OFFER_LIST_XML_ID, PRODUCT_XML_ID))");
690 elseif ($value ==
"b_catalog_cml_tmp")
692 $DB->Query(
"create table b_catalog_cml_tmp (
693 ID int(11) not null default '0',
694 XML_ID varchar(100) not null,
695 CATALOG_ID int(11) not null,
697 primary key (CATALOG_ID, XML_ID),
698 index IXS_CAT_CML_TMP (ID))");
710 if (isset($_FILES[
"FILE_1C"]) && is_uploaded_file($_FILES[
"FILE_1C"][
"tmp_name"]))
715 if ($URL_FILE_1C <>
'')
717 $URL_FILE_1C =
Rel2Abs(
"/", $URL_FILE_1C);
718 if (file_exists(
$_SERVER[
"DOCUMENT_ROOT"].$URL_FILE_1C) && is_file(
$_SERVER[
"DOCUMENT_ROOT"].$URL_FILE_1C))
744 if ($iblocks->ExtractFields(
"f_"))
750 if ($keepExistingProperties !=
"Y" && $keepExistingProperties !=
"N")
752 $bKeepExistingProperties = (($keepExistingProperties ==
"Y") ? true :
false);
754 if ($keepExistingData !=
"Y" && $keepExistingData !=
"N")
762 if ($deleteComments !=
"Y" && $deleteComments !=
"N")
764 $bDeleteComments = (($deleteComments ==
"Y") ? true :
false);
767 if ($cmlDebug !=
"Y" && $cmlDebug !=
"N")
769 $bCmlDebug = (($cmlDebug ==
"Y") ? true :
false);
771 global $bCmlMemoryDebug;
772 if ($cmlMemoryDebug !=
"Y" && $cmlMemoryDebug !=
"N")
774 $bCmlMemoryDebug = (($cmlMemoryDebug ==
"Y") ? true :
false);
778 include(__DIR__.
'/ru/commerceml_g_run_cur.php');
784 include(__DIR__.
'/ru/commerceml_g_run_name.php');
788 global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer;
789 $currentCatalog =
false;
790 $currentProduct =
false;
791 $currentProperty =
false;
792 $currentOffersList =
false;
793 $currentOffer =
false;
795 global $arIBlockCache, $iBlockIDString;
796 $arIBlockCache =
array();
797 $iBlockIDString =
"0";
800 $cmlLoadCnts =
array();
801 $cmlLoadCnts[
"CATALOG"] = 0;
802 $cmlLoadCnts[
"PROPERTY"] = 0;
803 $cmlLoadCnts[
"SECTION"] = 0;
804 $cmlLoadCnts[
"PRODUCT"] = 0;
805 $cmlLoadCnts[
"OFFER"] = 0;
812 $boolTranslitElement =
false;
813 $boolTranslitSection =
false;
814 $arTranslitElement =
array();
815 $arTranslitSection =
array();
823 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_property");
824 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_property_var");
825 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_section");
826 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product");
827 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product_cat");
828 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product_prop");
829 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_oflist");
830 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_oflist_prop");
831 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_offer");
832 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
837 $oIBlock =
new CIBlock();
840 $tmpid = md5(uniqid(
""));
845 if ($pe = mb_strpos($xmlData,
">"))
847 $headerString = mb_substr($xmlData, 0, $pe);
848 if(preg_match(
'#encoding[\s]*=[\s]*"(.*?)"#i', $headerString, $arMatch))
856 if ($bDeleteComments)
858 $xmlData = preg_replace(
"#<\!--.*?-->#s",
"", $xmlData);
878 $pb = mb_strpos($xmlData,
"<");
879 while ($pb !==
false)
881 $pe = mb_strpos($xmlData,
">", $pb);
885 $tag_cont = mb_substr($xmlData, $pb + 1, $pe - $pb - 1);
886 $pb = mb_strpos($xmlData,
"<", $pe);
888 $check_str = mb_substr($tag_cont, 0, 1);
898 $ltag_cont = mb_strlen($tag_cont);
899 while((
$p < $ltag_cont) && (mb_strpos(
" \t\n\r", mb_substr($tag_cont,
$p, 1)) ===
false))
901 $name = mb_substr($tag_cont, 0,
$p);
902 $at = mb_substr($tag_cont,
$p);
903 if (mb_strpos($at,
"&") !==
false)
908 preg_match_all(
"/(\\S+)\\s*=\\s*[\"](.*?)[\"]/su", $at, $attrs_tmp);
910 for (
$i=0, $intCount =
count($attrs_tmp[1]);
$i<$intCount;
$i++)
911 $attrs[$attrs_tmp[1][
$i]] = ($bAmp ? preg_replace($search, $replace, $attrs_tmp[2][
$i]) : $attrs_tmp[2][
$i]);
914 if(mb_substr($tag_cont, -1) ===
"/")
926 if ($iBlockIDString !=
"0")
930 $strSql =
"INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID) ".
931 "SELECT CASE WHEN P.ID IS NULL THEN 0 ELSE P.ID END, X.XML_ID, X.CATALOG_ID FROM b_catalog_cml_property X ".
932 " LEFT JOIN b_iblock_property P ON (P.XML_ID = X.XML_ID AND P.IBLOCK_ID = X.CATALOG_ID) ";
937 "INSERT INTO b_iblock_property(IBLOCK_ID, NAME, ACTIVE, SORT, DEFAULT_VALUE, PROPERTY_TYPE, MULTIPLE, XML_ID, TMP_ID) ".
938 "SELECT T.CATALOG_ID, X.NAME, 'Y', 500, X.DEFAULT_VALUE, X.DATA_TYPE, X.MULTIPLE, X.XML_ID, '".$DB->ForSql($tmpid).
"' ".
939 "FROM b_catalog_cml_tmp T ".
940 " INNER JOIN b_catalog_cml_property X ON (T.CATALOG_ID = X.CATALOG_ID AND T.XML_ID = X.XML_ID) ".
946 "SELECT P.ID, X.NAME, X.DATA_TYPE, X.MULTIPLE, X.DEFAULT_VALUE, X.XML_ID ".
947 "FROM b_catalog_cml_tmp T ".
948 " INNER JOIN b_catalog_cml_property X ON (T.CATALOG_ID = X.CATALOG_ID AND T.XML_ID = X.XML_ID) ".
949 " INNER JOIN b_iblock_property P ON (T.CATALOG_ID = P.IBLOCK_ID AND T.XML_ID = P.XML_ID) ".
955 "UPDATE b_iblock_property SET ".
956 " NAME = '".$DB->ForSql(
$arRes[
"NAME"]).
"', ".
957 " PROPERTY_TYPE = '".$arRes[
"DATA_TYPE"].
"', ".
958 " MULTIPLE = '".$arRes[
"MULTIPLE"].
"', ".
959 " DEFAULT_VALUE = '".$DB->ForSql(
$arRes[
"DEFAULT_VALUE"]).
"', ".
960 " TMP_ID = '".$DB->ForSql($tmpid).
"' ".
961 "WHERE ID = ".$arRes[
"ID"].
" ";
966 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
973 "INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID, VALUE_ID) ".
974 "SELECT CASE WHEN PV.ID IS NULL THEN 0 ELSE PV.ID END, X.XML_ID, X.CATALOG_ID, P.ID ".
975 "FROM b_catalog_cml_property_var X ".
976 " LEFT JOIN b_iblock_property P ON (P.XML_ID = X.PROPERTY_XML_ID AND P.IBLOCK_ID = X.CATALOG_ID) ".
977 " LEFT JOIN b_iblock_property_enum PV ON (PV.XML_ID = X.XML_ID AND PV.PROPERTY_ID = P.ID) ";
982 "INSERT INTO b_iblock_property_enum(PROPERTY_ID, VALUE, DEF, SORT, XML_ID, TMP_ID) ".
983 "SELECT T.VALUE_ID, XV.NAME, XV.DEFAULT_VALUE, 500, XV.XML_ID, '".$DB->ForSql($tmpid).
"' ".
984 "FROM b_catalog_cml_tmp T ".
985 " INNER JOIN b_catalog_cml_property_var XV ON (T.XML_ID = XV.XML_ID AND T.CATALOG_ID = XV.CATALOG_ID) ".
991 "SELECT PV.ID, XV.NAME, XV.DEFAULT_VALUE ".
992 "FROM b_catalog_cml_tmp T ".
993 " INNER JOIN b_catalog_cml_property_var XV ON (T.XML_ID = XV.XML_ID AND T.CATALOG_ID = XV.CATALOG_ID) ".
994 " INNER JOIN b_iblock_property_enum PV ON (PV.XML_ID = T.XML_ID AND PV.PROPERTY_ID = T.VALUE_ID) ".
1000 "UPDATE b_iblock_property_enum SET ".
1001 " VALUE = '".$DB->ForSql(
$arRes[
"NAME"]).
"', ".
1002 " DEF = '".$arRes[
"DEFAULT_VALUE"].
"', ".
1003 " TMP_ID = '".$DB->ForSql($tmpid).
"' ".
1004 "WHERE ID = ".$arRes[
"ID"].
" ";
1005 $DB->Query($strSql);
1009 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
1011 if (function_exists(
"catalog_1c_mutator_property"))
1012 catalog_1c_mutator_property($iBlockIDString);
1019 "INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID) ".
1020 "SELECT CASE WHEN S.ID IS NULL THEN 0 ELSE S.ID END, X.XML_ID, X.CATALOG_ID FROM b_catalog_cml_section X ".
1021 " LEFT JOIN b_iblock_section S ON (S.XML_ID = X.XML_ID AND X.CATALOG_ID = S.IBLOCK_ID) ";
1022 $DB->Query($strSql);
1025 if ($keepExistingData ==
"N")
1029 $arPropsCache =
array();
1032 "SELECT S.ID, S.IBLOCK_ID FROM b_iblock_section S1 ".
1033 " INNER JOIN b_iblock_section S ON (S1.IBLOCK_ID = S.IBLOCK_ID AND S.LEFT_MARGIN >= S1.LEFT_MARGIN AND S.RIGHT_MARGIN <= S1.RIGHT_MARGIN) ".
1034 " LEFT JOIN b_catalog_cml_tmp T ON (S1.ID = T.ID) ".
1035 "WHERE S1.IBLOCK_ID IN (".$iBlockIDString.
") AND T.ID IS NULL";
1040 $sectionIDs .=
",".$arRes[
"ID"];
1042 if (!array_key_exists(
$arRes[
"IBLOCK_ID"], $arPropsCache))
1044 $arPropsCache[
$arRes[
"IBLOCK_ID"]] =
"0";
1046 "SELECT ID FROM b_iblock_property WHERE LINK_IBLOCK_ID = ".$arRes[
"IBLOCK_ID"].
" AND PROPERTY_TYPE = 'G'";
1047 $dbRes1 =
$DB->Query($strSql);
1048 while ($arRes1 = $dbRes1->Fetch())
1050 $arPropsCache[
$arRes[
"IBLOCK_ID"]] .=
",".$arRes1[
"ID"];
1056 $strSql =
"DELETE FROM b_catalog_discount2section WHERE SECTION_ID IN (".$sectionIDs.
")";
1057 $DB->Query($strSql);
1059 $strSql =
"UPDATE b_iblock_element SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1060 $DB->Query($strSql);
1062 $strSql =
"DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1063 $DB->Query($strSql);
1065 $strSql =
"UPDATE b_iblock_section SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1066 $DB->Query($strSql);
1068 $strSql =
"DELETE FROM b_iblock_section WHERE ID IN (".$sectionIDs.
")";
1069 $DB->Query($strSql);
1075 if ($arPropsCache[
$arRes[
"IBLOCK_ID"]] !=
"0")
1077 $strSql =
"DELETE FROM b_iblock_element_property WHERE VALUE_NUM = ".$arRes[
"ID"].
" AND IBLOCK_PROPERTY_ID IN (".$arPropsCache[
$arRes[
"IBLOCK_ID"]].
")";
1078 $DB->Query($strSql);
1084 $strSql =
"DELETE FROM b_catalog_discount2section WHERE SECTION_ID IN (".$sectionIDs.
")";
1085 $DB->Query($strSql);
1087 $strSql =
"UPDATE b_iblock_element SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1088 $DB->Query($strSql);
1090 $strSql =
"DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1091 $DB->Query($strSql);
1093 $strSql =
"UPDATE b_iblock_section SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.
")";
1094 $DB->Query($strSql);
1096 $strSql =
"DELETE FROM b_iblock_section WHERE ID IN (".$sectionIDs.
")";
1097 $DB->Query($strSql);
1099 $strSql =
"DELETE FROM b_iblock_element_property WHERE VALUE_NUM IN (".$sectionIDs.
")";
1100 $DB->Query($strSql);
1109 $strSql =
"SELECT T.ID, X.NAME, X.PARENT_XML_ID, X.CODE FROM b_catalog_cml_tmp T ".
1110 " INNER JOIN b_catalog_cml_section X ON (T.XML_ID = X.XML_ID AND T.CATALOG_ID = X.CATALOG_ID) ".
1116 "UPDATE b_iblock_section SET ".
1117 " NAME = '".$DB->ForSql(
$arRes[
"NAME"]).
"', ".
1118 " TMP_ID = '".$DB->ForSql($tmpid).
"' ".
1119 (
true === $boolTranslitSection ?
" , CODE = '".$DB->ForSql(
$arRes[
"CODE"]).
"' ":
'').
1120 ($bActivateFileData ?
", ACTIVE = 'Y' " :
"").
1121 "WHERE ID = ".
$arRes[
"ID"].
" ";
1122 $DB->Query($strSql);
1127 "INSERT INTO b_iblock_section(IBLOCK_ID, ACTIVE, GLOBAL_ACTIVE, SORT, NAME, XML_ID, TMP_ID".(true === $boolTranslitSection ?
', CODE' :
'').
") ".
1128 "SELECT T.CATALOG_ID, 'Y', 'Y', 500, X.NAME, X.XML_ID, '".
$DB->ForSql($tmpid).
"'".(
true === $boolTranslitSection ?
', X.CODE ' :
'').
' '.
1129 "FROM b_catalog_cml_tmp T ".
1130 " INNER JOIN b_catalog_cml_section X ON (T.XML_ID = X.XML_ID AND T.CATALOG_ID = X.CATALOG_ID) ".
1132 $DB->Query($strSql);
1136 "SELECT S.ID, S1.ID as VALUE_ID ".
1137 "FROM b_catalog_cml_section X ".
1138 " INNER JOIN b_iblock_section S ON (S.XML_ID = X.XML_ID AND X.CATALOG_ID = S.IBLOCK_ID) ".
1139 " LEFT JOIN b_iblock_section S1 ON (S1.XML_ID IS NOT NULL AND S1.XML_ID = X.PARENT_XML_ID AND X.CATALOG_ID = S1.IBLOCK_ID) ";
1144 "UPDATE b_iblock_section SET ".
1145 " IBLOCK_SECTION_ID = ".((intval(
$arRes[
"VALUE_ID"]) > 0) ? intval(
$arRes[
"VALUE_ID"]) :
"NULL" ).
" ".
1146 "WHERE ID = ".$arRes[
"ID"].
" ";
1147 $DB->Query($strSql);
1151 function ReSort($iblockID, $id = 0, $cnt = 0, $depth = 0, $active =
"Y")
1154 $iblockID = intval($iblockID);
1158 "UPDATE b_iblock_section SET ".
1159 " TIMESTAMP_X = ".((
$DB->type==
"ORACLE") ?
"NULL" :
"TIMESTAMP_X").
", ".
1160 " RIGHT_MARGIN = ".intval($cnt).
", ".
1161 " LEFT_MARGIN = ".intval($cnt).
" ".
1162 "WHERE ID=".intval($id));
1165 "SELECT BS.ID, BS.ACTIVE ".
1166 "FROM b_iblock_section BS ".
1167 "WHERE BS.IBLOCK_ID = ".$iblockID.
" ".
1168 " AND ".(($id > 0) ?
"BS.IBLOCK_SECTION_ID = ".intval($id) :
"BS.IBLOCK_SECTION_ID IS NULL").
" ".
1169 "ORDER BY BS.SORT, BS.NAME ";
1174 $cnt = ReSort($iblockID,
$arr[
"ID"], $cnt, $depth + 1, (($active==
"Y" &&
$arr[
"ACTIVE"]==
"Y") ?
"Y" :
"N"));
1180 "UPDATE b_iblock_section SET ".
1181 " TIMESTAMP_X = ".(
$DB->type==
"ORACLE"?
"NULL":
"TIMESTAMP_X").
", ".
1182 " RIGHT_MARGIN = ".intval($cnt).
", ".
1183 " DEPTH_LEVEL = ".intval($depth).
", ".
1184 " GLOBAL_ACTIVE = '".$active.
"' ".
1185 "WHERE ID=".intval($id));
1189 $arIBlockIDString = explode(
",", $iBlockIDString);
1190 if (!empty($arIBlockIDString))
1192 for (
$i = 0, $intIBCount =
count($arIBlockIDString);
$i < $intIBCount;
$i++)
1194 if (intval($arIBlockIDString[
$i]) == 0)
1197 ReSort($arIBlockIDString[
$i]);
1202 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
1204 if (function_exists(
"catalog_1c_mutator_section"))
1205 catalog_1c_mutator_section($iBlockIDString);
1212 "INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID) ".
1213 "SELECT CASE WHEN P.ID IS NULL THEN 0 ELSE P.ID END, X.XML_ID, X.CATALOG_ID ".
1214 "FROM b_catalog_cml_product X ".
1215 " LEFT JOIN b_iblock_element P USE INDEX (ix_iblock_element_4) ON (P.XML_ID = X.XML_ID AND X.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ";
1216 $DB->Query($strSql);
1218 $DB->Query(
"REPAIR TABLE b_catalog_cml_tmp QUICK",
true);
1223 if ($keepExistingData ==
"N")
1228 $strSql =
"SELECT P.ID, P.IBLOCK_ID FROM b_iblock_element P LEFT JOIN b_catalog_cml_tmp T ON (P.ID = T.ID) ".
1229 "WHERE P.IBLOCK_ID IN (".$iBlockIDString.
") AND T.ID IS NULL AND P.WF_PARENT_ELEMENT_ID IS NULL";
1234 $productIDs .=
",".$arRes[
"ID"];
1238 $strSql =
"DELETE FROM b_catalog_discount2product WHERE PRODUCT_ID IN (".$productIDs.
")";
1239 $DB->Query($strSql);
1241 $strSql =
"DELETE FROM b_catalog_price WHERE PRODUCT_ID IN (".$productIDs.
")";
1242 $DB->Query($strSql);
1244 $strSql =
"DELETE FROM b_catalog_product2group WHERE PRODUCT_ID IN (".$productIDs.
")";
1245 $DB->Query($strSql);
1247 $strSql =
"DELETE FROM b_catalog_product WHERE ID IN (".$productIDs.
")";
1248 $DB->Query($strSql);
1250 $strSql =
"DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1251 $DB->Query($strSql);
1253 $strSql =
"DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1254 $DB->Query($strSql);
1256 $strSql =
"DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1257 $DB->Query($strSql,
true);
1259 $strSql =
"DELETE FROM b_iblock_element WHERE ID IN (".$productIDs.
")";
1260 $DB->Query($strSql);
1269 $strSql =
"DELETE FROM b_catalog_discount2product WHERE PRODUCT_ID IN (".$productIDs.
")";
1270 $DB->Query($strSql);
1272 $strSql =
"DELETE FROM b_catalog_price WHERE PRODUCT_ID IN (".$productIDs.
")";
1273 $DB->Query($strSql);
1275 $strSql =
"DELETE FROM b_catalog_product2group WHERE PRODUCT_ID IN (".$productIDs.
")";
1276 $DB->Query($strSql);
1278 $strSql =
"DELETE FROM b_catalog_product WHERE ID IN (".$productIDs.
")";
1279 $DB->Query($strSql);
1281 $strSql =
"DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1282 $DB->Query($strSql);
1284 $strSql =
"DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1285 $DB->Query($strSql);
1287 $strSql =
"DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1288 $DB->Query($strSql,
true);
1290 $strSql =
"DELETE FROM b_iblock_element WHERE ID IN (".$productIDs.
")";
1291 $DB->Query($strSql);
1299 "SELECT P.ID, P.IBLOCK_ID ".
1300 "FROM b_iblock_element P ".
1301 " LEFT JOIN b_catalog_cml_tmp T ON (P.WF_PARENT_ELEMENT_ID = T.ID) ".
1302 "WHERE P.IBLOCK_ID IN (".$iBlockIDString.
") ".
1303 " AND P.WF_PARENT_ELEMENT_ID IS NOT NULL ".
1304 " AND T.ID IS NULL ";
1309 $productIDs .=
",".$arRes[
"ID"];
1314 "DELETE FROM b_catalog_discount2product ".
1315 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1316 $DB->Query($strSql);
1319 "DELETE FROM b_catalog_price ".
1320 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1321 $DB->Query($strSql);
1324 "DELETE FROM b_catalog_product2group ".
1325 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1326 $DB->Query($strSql);
1329 "DELETE FROM b_catalog_product ".
1330 "WHERE ID IN (".$productIDs.
") ";
1331 $DB->Query($strSql);
1334 "DELETE FROM b_iblock_element_property ".
1335 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1336 $DB->Query($strSql);
1339 "DELETE FROM b_iblock_section_element ".
1340 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1341 $DB->Query($strSql);
1344 "DELETE FROM b_workflow_move ".
1345 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1346 $DB->Query($strSql,
true);
1349 "DELETE FROM b_iblock_element ".
1350 "WHERE ID IN (".$productIDs.
") ";
1351 $DB->Query($strSql);
1361 "DELETE FROM b_catalog_discount2product ".
1362 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1363 $DB->Query($strSql);
1366 "DELETE FROM b_catalog_price ".
1367 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1368 $DB->Query($strSql);
1371 "DELETE FROM b_catalog_product2group ".
1372 "WHERE PRODUCT_ID IN (".$productIDs.
") ";
1373 $DB->Query($strSql);
1376 "DELETE FROM b_catalog_product ".
1377 "WHERE ID IN (".$productIDs.
") ";
1378 $DB->Query($strSql);
1381 "DELETE FROM b_iblock_element_property ".
1382 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1383 $DB->Query($strSql);
1386 "DELETE FROM b_iblock_section_element ".
1387 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1388 $DB->Query($strSql);
1391 "DELETE FROM b_workflow_move ".
1392 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ";
1393 $DB->Query($strSql,
true);
1396 "DELETE FROM b_iblock_element ".
1397 "WHERE ID IN (".$productIDs.
") ";
1398 $DB->Query($strSql);
1406 "SELECT T.ID, X.NAME, X.MODIFIED_BY, X.CODE, S.ID as PARENT_CATEGORY, MIN(S1.ID) as CNT ".
1407 "FROM b_catalog_cml_tmp T ".
1408 " INNER JOIN b_catalog_cml_product X ON (T.XML_ID = X.XML_ID AND T.CATALOG_ID = X.CATALOG_ID) ".
1409 " LEFT JOIN b_iblock_section S ON (S.XML_ID = X.PARENT_CATEGORY AND X.CATALOG_ID = S.IBLOCK_ID) ".
1410 " LEFT JOIN b_catalog_cml_product_cat XC ON (T.CATALOG_ID = XC.CATALOG_ID AND T.XML_ID = XC.PRODUCT_XML_ID) ".
1411 " LEFT JOIN b_iblock_section S1 ON (S1.XML_ID = XC.CATEGORY_XML_ID AND XC.CATALOG_ID = S1.IBLOCK_ID) ".
1413 "GROUP BY T.ID, X.NAME, X.MODIFIED_BY, X.CODE, S.ID";
1418 "UPDATE b_iblock_element SET ".
1419 " MODIFIED_BY = '".$arRes[
"MODIFIED_BY"].
"', ".
1420 " NAME = '".$DB->ForSql(
$arRes[
"NAME"]).
"', ".
1421 " IBLOCK_SECTION_ID = ".((intval(
$arRes[
"PARENT_CATEGORY"]) > 0) ? intval(
$arRes[
"PARENT_CATEGORY"]) :
"NULL" ).
", ".
1422 " IN_SECTIONS = '".((intval(
$arRes[
"CNT"]) > 0) ?
"Y" :
"N" ).
"', ".
1423 " TIMESTAMP_X = NOW(), ".
1424 " TMP_ID = '".$DB->ForSql($tmpid).
"' ".
1425 (
true == $boolTranslitElement ?
", CODE = '".$DB->ForSql(
$arRes[
'CODE']).
"'" :
'').
1426 ($bActivateFileData ?
", ACTIVE = 'Y' " :
"").
1427 "WHERE ID = ".
$arRes[
"ID"].
" ";
1428 $DB->Query($strSql);
1435 "INSERT INTO b_iblock_element(IBLOCK_ID, ACTIVE, MODIFIED_BY, CREATED_BY, SORT, NAME, XML_ID, IBLOCK_SECTION_ID, IN_SECTIONS, TMP_ID, TIMESTAMP_X".(true === $boolTranslitElement ?
', CODE' :
'').
") ".
1436 "SELECT T.CATALOG_ID, 'Y', X.MODIFIED_BY, X.MODIFIED_BY, 500, X.NAME, X.XML_ID, S.ID, CASE WHEN MIN(S1.ID) THEN 'Y' ELSE 'N' END, '".
$DB->ForSql($tmpid).
"', NOW()".(
true === $boolTranslitElement ?
', X.CODE':
'').
' '.
1437 "FROM b_catalog_cml_tmp T ".
1438 " INNER JOIN b_catalog_cml_product X ON (T.XML_ID = X.XML_ID AND T.CATALOG_ID = X.CATALOG_ID) ".
1439 " LEFT JOIN b_iblock_section S ON (S.XML_ID = X.PARENT_CATEGORY AND X.CATALOG_ID = S.IBLOCK_ID) ".
1440 " LEFT JOIN b_catalog_cml_product_cat XC ON (T.CATALOG_ID = XC.CATALOG_ID AND T.XML_ID = XC.PRODUCT_XML_ID) ".
1441 " LEFT JOIN b_iblock_section S1 ON (S1.XML_ID = XC.CATEGORY_XML_ID AND XC.CATALOG_ID = S1.IBLOCK_ID) ".
1443 "GROUP BY T.CATALOG_ID, X.MODIFIED_BY, X.NAME, X.XML_ID, X.CODE, S.ID";
1444 $DB->Query($strSql);
1451 $catalogGroupsString =
"0";
1454 "FROM b_catalog_cml_oflist X ".
1455 " INNER JOIN b_catalog_cml_oflist_prop XP ON (XP.OFFER_LIST_XML_ID = X.ID) ".
1456 " INNER JOIN b_catalog_group CG ON (CG.NAME = XP.PROPERTY_VALUE) ";
1459 $catalogGroupsString .=
",".$arRes[
"ID"];
1461 $catalogPropertiesString =
"0";
1464 "FROM b_catalog_cml_property XP ".
1465 " INNER JOIN b_iblock_property P ON (P.XML_ID = XP.XML_ID AND XP.CATALOG_ID = P.IBLOCK_ID) ";
1468 $catalogPropertiesString .=
",".$arRes[
"ID"];
1476 "FROM b_catalog_cml_product X ".
1477 " INNER JOIN b_iblock_element P ON (P.XML_ID = X.XML_ID AND X.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ";
1482 $productIDs .=
",".$arRes[
"ID"];
1487 "DELETE FROM b_iblock_section_element ".
1488 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ".
1489 " AND ADDITIONAL_PROPERTY_ID IS NULL";
1490 $DB->Query($strSql);
1493 "DELETE FROM b_catalog_price ".
1494 "WHERE PRODUCT_ID IN (".$productIDs.
") ".
1495 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.
")";
1496 $DB->Query($strSql);
1499 "DELETE FROM b_iblock_element_property ".
1500 "WHERE IBLOCK_PROPERTY_ID IN (".$catalogPropertiesString.
") ".
1501 " AND IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1502 $DB->Query($strSql);
1512 "DELETE FROM b_iblock_section_element ".
1513 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.
") ".
1514 " AND ADDITIONAL_PROPERTY_ID IS NULL";
1515 $DB->Query($strSql);
1518 "DELETE FROM b_catalog_price ".
1519 "WHERE PRODUCT_ID IN (".$productIDs.
") ".
1520 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.
")";
1521 $DB->Query($strSql);
1524 "DELETE FROM b_iblock_element_property ".
1525 "WHERE IBLOCK_PROPERTY_ID IN (".$catalogPropertiesString.
") ".
1526 " AND IBLOCK_ELEMENT_ID IN (".$productIDs.
")";
1527 $DB->Query($strSql);
1534 "INSERT INTO b_iblock_section_element(IBLOCK_SECTION_ID, IBLOCK_ELEMENT_ID) ".
1535 "SELECT S.ID, P.ID ".
1536 "FROM b_catalog_cml_product X ".
1537 " INNER JOIN b_iblock_element P ON (P.XML_ID = X.XML_ID AND X.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ".
1538 " INNER JOIN b_catalog_cml_product_cat XC ON (X.CATALOG_ID = XC.CATALOG_ID AND X.XML_ID = XC.PRODUCT_XML_ID) ".
1539 " INNER JOIN b_iblock_section S ON (S.XML_ID = XC.CATEGORY_XML_ID AND XC.CATALOG_ID = S.IBLOCK_ID) ";
1540 $DB->Query($strSql);
1548 "INSERT INTO b_iblock_element_property(IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID, VALUE, VALUE_NUM) ".
1549 "SELECT STRAIGHT_JOIN P.ID, E.ID, XV.PROPERTY_VALUE_TEXT, XV.PROPERTY_VALUE ".
1550 "FROM b_catalog_cml_product_prop XV ".
1551 " INNER JOIN b_iblock_property P ON (XV.CATALOG_ID = P.IBLOCK_ID AND XV.PROPERTY_XML_ID = P.XML_ID) ".
1552 " INNER JOIN b_catalog_cml_property XP ON (XP.CATALOG_ID = XV.CATALOG_ID AND P.XML_ID = XP.XML_ID) ".
1553 " INNER JOIN b_iblock_element E USE INDEX (ix_iblock_element_4) ON (XP.CATALOG_ID = E.IBLOCK_ID AND E.XML_ID = XV.PRODUCT_XML_ID AND E.WF_PARENT_ELEMENT_ID IS NULL) ".
1554 "WHERE P.PROPERTY_TYPE <> 'L' ";
1555 $DB->Query($strSql);
1560 "INSERT INTO b_iblock_element_property(IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID, VALUE, value_enum) ".
1561 "SELECT STRAIGHT_JOIN P.ID, E.ID, PE.ID, PE.ID ".
1562 "FROM b_catalog_cml_product_prop XV ".
1563 " INNER JOIN b_iblock_property P ON (XV.CATALOG_ID = P.IBLOCK_ID AND XV.PROPERTY_XML_ID = P.XML_ID) ".
1564 " INNER JOIN b_catalog_cml_property XP ON (XP.CATALOG_ID = XV.CATALOG_ID AND XP.XML_ID = P.XML_ID) ".
1565 " INNER JOIN b_iblock_element E USE INDEX (ix_iblock_element_4) ON (XP.CATALOG_ID = E.IBLOCK_ID AND E.XML_ID = XV.PRODUCT_XML_ID AND E.WF_PARENT_ELEMENT_ID IS NULL) ".
1566 " INNER JOIN b_iblock_property_enum PE ON (PE.PROPERTY_ID = P.ID AND XV.PROPERTY_VALUE = PE.XML_ID) ".
1567 "WHERE P.PROPERTY_TYPE = 'L' ";
1568 $DB->Query($strSql);
1573 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
1575 if (function_exists(
"catalog_1c_mutator_product"))
1576 catalog_1c_mutator_product($iBlockIDString);
1584 "INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID, VALUE_ID) ".
1585 "SELECT CASE WHEN CP.ID IS NULL THEN 0 ELSE CP.ID END, X.XML_ID, X.CATALOG_ID, P.ID ".
1586 "FROM b_catalog_cml_product X ".
1587 " INNER JOIN b_iblock_element P USE INDEX (ix_iblock_element_4) ON (P.XML_ID = X.XML_ID AND X.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ".
1588 " LEFT JOIN b_catalog_product CP ON (P.ID = CP.ID) ";
1589 $DB->Query($strSql);
1591 $DB->Query(
"REPAIR TABLE b_catalog_cml_tmp QUICK",
true);
1597 "SELECT T.ID, MIN(X.AMOUNT) as CNT ".
1598 "FROM b_catalog_cml_tmp T ".
1599 " INNER JOIN b_catalog_cml_oflist XL ON (XL.CATALOG_ID = T.CATALOG_ID) ".
1600 " LEFT JOIN b_catalog_cml_offer X ON (X.PRODUCT_XML_ID = T.XML_ID AND X.OFFER_LIST_XML_ID = XL.ID) ".
1607 "UPDATE b_catalog_product SET ".
1608 " QUANTITY = ".intval(
$arRes[
"CNT"]).
" ".
1609 "WHERE ID = ".$arRes[
"ID"].
" ";
1610 $DB->Query($strSql);
1617 "INSERT INTO b_catalog_product(ID, QUANTITY) ".
1618 "SELECT T.VALUE_ID, MIN(X.AMOUNT) ".
1619 "FROM b_catalog_cml_tmp T ".
1620 " INNER JOIN b_catalog_cml_oflist XL ON (XL.CATALOG_ID = T.CATALOG_ID) ".
1621 " LEFT JOIN b_catalog_cml_offer X ON (X.PRODUCT_XML_ID = T.XML_ID AND X.OFFER_LIST_XML_ID = XL.ID) ".
1623 "GROUP BY T.VALUE_ID";
1624 $DB->Query($strSql);
1630 "INSERT INTO b_catalog_price(PRODUCT_ID, CATALOG_GROUP_ID, PRICE, CURRENCY)".
1631 "SELECT P.ID, CG.ID, XO.PRICE, XO.CURRENCY ".
1632 "FROM b_catalog_cml_product X ".
1633 " INNER JOIN b_iblock_element P ON (P.XML_ID = X.XML_ID AND X.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ".
1634 " INNER JOIN b_catalog_cml_oflist XL ON (XL.CATALOG_ID = P.IBLOCK_ID) ".
1635 " INNER JOIN b_catalog_cml_oflist_prop XLP ON (XLP.OFFER_LIST_XML_ID = XL.ID) ".
1636 " INNER JOIN b_catalog_group CG ON (CG.NAME = XLP.PROPERTY_VALUE) ".
1637 " INNER JOIN b_catalog_cml_offer XO ON (XO.OFFER_LIST_XML_ID = XL.ID AND XO.PRODUCT_XML_ID = X.XML_ID) ";
1638 $DB->Query($strSql);
1640 if (function_exists(
"catalog_1c_mutator_offer"))
1641 catalog_1c_mutator_offer($iBlockIDString, $catalogGroupsString);
1647 if (!$bKeepExistingProperties && ($keepExistingData ==
"N"))
1653 "SELECT P.ID, P.IBLOCK_ID ".
1654 "FROM b_iblock_property P ".
1655 " LEFT JOIN b_catalog_cml_property X ON (P.IBLOCK_ID = X.CATALOG_ID AND P.XML_ID = X.XML_ID) ".
1656 "WHERE P.IBLOCK_ID IN (".$iBlockIDString.
") ".
1657 " AND X.XML_ID IS NULL ";
1662 $propertyIDs .=
",".$arRes[
"ID"];
1667 "DELETE FROM b_iblock_element_property ".
1668 "WHERE IBLOCK_PROPERTY_ID IN (".$propertyIDs.
") ";
1669 $DB->Query($strSql);
1672 "DELETE FROM b_iblock_property_enum ".
1673 "WHERE PROPERTY_ID IN (".$propertyIDs.
") ";
1674 $DB->Query($strSql);
1677 "DELETE FROM b_iblock_section_element ".
1678 "WHERE ADDITIONAL_PROPERTY_ID IN (".$propertyIDs.
") ";
1679 $DB->Query($strSql);
1682 "DELETE FROM b_iblock_property ".
1683 "WHERE ID IN (".$propertyIDs.
") ";
1684 $DB->Query($strSql);
1694 "DELETE FROM b_iblock_element_property ".
1695 "WHERE IBLOCK_PROPERTY_ID IN (".$propertyIDs.
") ";
1696 $DB->Query($strSql);
1699 "DELETE FROM b_iblock_property_enum ".
1700 "WHERE PROPERTY_ID IN (".$propertyIDs.
") ";
1701 $DB->Query($strSql);
1704 "DELETE FROM b_iblock_section_element ".
1705 "WHERE ADDITIONAL_PROPERTY_ID IN (".$propertyIDs.
") ";
1706 $DB->Query($strSql);
1709 "DELETE FROM b_iblock_property ".
1710 "WHERE ID IN (".$propertyIDs.
") ";
1711 $DB->Query($strSql);
1721 "INSERT INTO b_catalog_cml_tmp(ID, XML_ID, CATALOG_ID, VALUE_ID) ".
1722 "SELECT DISTINCT STRAIGHT_JOIN SQL_BIG_RESULT CASE WHEN CP.ID IS NULL THEN 0 ELSE CP.ID END, P.XML_ID, P.IBLOCK_ID, P.ID ".
1723 "FROM b_catalog_cml_offer X ".
1724 " INNER JOIN b_catalog_cml_oflist XL ON (X.OFFER_LIST_XML_ID = XL.ID) ".
1725 " INNER JOIN b_iblock_element P USE INDEX (ix_iblock_element_4) ON (P.XML_ID = X.PRODUCT_XML_ID AND XL.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ".
1726 " LEFT JOIN b_catalog_product CP ON (P.ID = CP.ID) ";
1727 $DB->Query($strSql);
1729 $DB->Query(
"REPAIR TABLE b_catalog_cml_tmp QUICK",
true);
1735 "SELECT T.ID, MIN(X.AMOUNT) as CNT ".
1736 "FROM b_catalog_cml_tmp T ".
1737 " INNER JOIN b_catalog_cml_oflist XL ON (XL.CATALOG_ID = T.CATALOG_ID) ".
1738 " LEFT JOIN b_catalog_cml_offer X ON (X.PRODUCT_XML_ID = T.XML_ID AND X.OFFER_LIST_XML_ID = XL.ID) ".
1745 "UPDATE b_catalog_product SET ".
1746 " QUANTITY = ".intval(
$arRes[
"CNT"]).
" ".
1747 "WHERE ID = ".$arRes[
"ID"].
" ";
1748 $DB->Query($strSql);
1755 "INSERT INTO b_catalog_product(ID, QUANTITY) ".
1756 "SELECT T.VALUE_ID, MIN(X.AMOUNT) ".
1757 "FROM b_catalog_cml_tmp T ".
1758 " INNER JOIN b_catalog_cml_oflist XL ON (XL.CATALOG_ID = T.CATALOG_ID) ".
1759 " LEFT JOIN b_catalog_cml_offer X ON (X.PRODUCT_XML_ID = T.XML_ID AND X.OFFER_LIST_XML_ID = XL.ID) ".
1761 "GROUP BY T.VALUE_ID";
1762 $DB->Query($strSql);
1767 $catalogGroupsString =
"0";
1770 "FROM b_catalog_cml_oflist X ".
1771 " INNER JOIN b_catalog_cml_oflist_prop XP ON (XP.OFFER_LIST_XML_ID = X.ID) ".
1772 " INNER JOIN b_catalog_group CG ON (CG.NAME = XP.PROPERTY_VALUE) ";
1775 $catalogGroupsString .=
",".$arRes[
"ID"];
1781 "SELECT T.VALUE_ID ".
1782 "FROM b_catalog_cml_tmp T ";
1787 $productIDs .=
",".$arRes[
"VALUE_ID"];
1792 "DELETE FROM b_catalog_price ".
1793 "WHERE PRODUCT_ID IN (".$productIDs.
") ".
1794 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.
")";
1795 $DB->Query($strSql);
1805 "DELETE FROM b_catalog_price ".
1806 "WHERE PRODUCT_ID IN (".$productIDs.
") ".
1807 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.
")";
1808 $DB->Query($strSql);
1815 "INSERT INTO b_catalog_price(PRODUCT_ID, CATALOG_GROUP_ID, PRICE, CURRENCY)".
1816 "SELECT STRAIGHT_JOIN P.ID, CG.ID, XO.PRICE, XO.CURRENCY ".
1817 "FROM b_catalog_cml_offer XO ".
1818 " INNER JOIN b_catalog_cml_oflist XL ON (XL.ID = XO.OFFER_LIST_XML_ID) ".
1819 " INNER JOIN b_iblock_element P USE INDEX (ix_iblock_element_4) ON (P.XML_ID = XO.PRODUCT_XML_ID AND XL.CATALOG_ID = P.IBLOCK_ID AND P.WF_PARENT_ELEMENT_ID IS NULL) ".
1820 " INNER JOIN b_catalog_cml_oflist_prop XLP ON (XLP.OFFER_LIST_XML_ID = XL.ID) ".
1821 " INNER JOIN b_catalog_group CG ON (CG.NAME = XLP.PROPERTY_VALUE) ";
1822 $DB->Query($strSql);
1824 if (function_exists(
"catalog_1c_mutator_offer"))
1825 catalog_1c_mutator_offer($iBlockIDString, $catalogGroupsString);
1832 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_property");
1833 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_property_var");
1834 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_section");
1835 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product");
1836 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product_cat");
1837 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_product_prop");
1838 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_oflist");
1839 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_oflist_prop");
1840 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_offer");
1841 $DB->Query(
"TRUNCATE TABLE b_catalog_cml_tmp");
1843 if (function_exists(
"catalog_1c_mutator_final"))
1844 catalog_1c_mutator_final($iBlockIDString);
1852 $totalExecutionTimeM = RoundEx($totalExecutionTime / 60, 1);
1853 $strImportOKMessage .= str_replace(
"#MIN#", (($totalExecutionTimeM > 1) ?
" (".$totalExecutionTimeM.
" ".
GetMessage(
"CML_R_MIN").
")" :
""), str_replace(
"#TIME#", $totalExecutionTime,
GetMessage(
"CML_R_TIME"))).
"<br>";
1863 if (isset($USER_TMP))
static convertEncoding($data, $charsetFrom, $charsetTo)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)