1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
commerceml_g_run.php
См. документацию.
1<?php
2//<title>CommerceML MySql Fast - BETA VERS</title>
3set_time_limit(0);
4
5const CML_DEBUG = false;
6const CML_MEMORY_DEBUG = false;
7const CML_DEBUG_FILE_NAME = "/__cml_time_mark.dat";
8
11const CML_DELETE_COMMENTS = false;
12
16
17//define("CML_USE_SYSTEM_DELETE", false);
18
19IncludeModuleLangFile($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/catalog/import_setup_templ.php');
20$startImportExecTime = microtime(true);
21
25{
26 $bTmpUserCreated = true;
27 if (isset($USER))
28 $USER_TMP = $USER;
29 $USER = new CUser();
30}
31
32if (file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c_mutator.php"))
33 include($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/1c_mutator.php");
34
38
39/************************ FUNCTIONS *******************************/
40if (!function_exists("file_get_contents"))
41{
42 function file_get_contents($filename)
43 {
44 $fd = fopen("$filename", "rb");
45 $content = fread($fd, filesize($filename));
46 fclose($fd);
47 return $content;
48 }
49}
50
51function cmlStartElement($parser, $name, $attrs)
52{
53 global $DB;
54 global $USER;
55 global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer;
56 global $arIBlockCache, $iBlockIDString, $arCMLCurrencies;
58 global $oIBlock, $cmlLoadCnts;
59
61 global $boolIBlockTranslit, $boolTranslitElement, $boolTranslitSection, $arTranslitElement, $arTranslitSection;
62
63 static $SITE_ID = false;
64
65 if (false === $SITE_ID)
66 {
67 $SITE_ID = 'ru';
68 $dbSite = CSite::GetByID($SITE_ID);
69 if (!$dbSite->Fetch())
70 {
71 $dbSite = CSite::GetList();
72 $arSite = $dbSite->Fetch();
73 $SITE_ID = $arSite['ID'];
74 }
75 }
76
77 switch ($name)
78 {
79 case $nameUTF["Catalog"]:
80 $currentCatalog = array();
81
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"]];
88
89 $boolVersion = true;
90 $dbIBlockList = CIBlock::GetList(
91 array(),
92 array("=TYPE" => $IBLOCK_TYPE_ID, "=XML_ID" => $currentCatalog["ID"], 'MIN_PERMISSION' => 'W')
93 );
94 if ($arIBlock = $dbIBlockList->Fetch())
95 {
96 $arIBlock['VERSION'] = intval($arIBlock['VERSION']);
97 if (1 != $arIBlock['VERSION'])
98 {
99 $bUpdate = true;
100 $boolVersion = false;
101 $res = false;
102 }
103 else
104 {
105 $bUpdate = true;
106 $currentCatalog["BID"] = $arIBlock["ID"];
107 $res = $oIBlock->Update(
108 $currentCatalog["BID"],
109 array(
110 "NAME" => $currentCatalog["Name"],
111 "DESCRIPTION" => $currentCatalog["Description"]
112 )
113 );
114 }
116 }
117 elseif ($USER->IsAdmin())
118 {
119 $bUpdate = false;
120 $arFields = Array(
121 "ACTIVE" => "Y",
122 "NAME" => $currentCatalog["Name"],
123 "XML_ID" => $currentCatalog["ID"],
124 "IBLOCK_TYPE_ID" => $IBLOCK_TYPE_ID,
125 "LID" => $SITE_ID,
126 "WORKFLOW" => "N",
127 "VERSION" => 1
128 );
129 if ('Y' == $USE_TRANSLIT && 'Y' == $ADD_TRANSLIT)
130 {
131 $arFields['FIELDS'] = array(
132 'CODE' => array(
133 'DEFAULT_VALUE' => array(
134 'TRANSLITERATION' => 'Y',
135 ),
136 ),
137 'SECTION_CODE' => array(
138 'DEFAULT_VALUE' => array(
139 'TRANSLITERATION' => 'Y',
140 ),
141 )
142 );
143 }
144 $currentCatalog["BID"] = $oIBlock->Add($arFields);
145 $res = ($currentCatalog["BID"] > 0);
146 }
147 else
148 $res = false;
149
150 $cmlLoadCnts["CATALOG"]++;
151
152 if (!$res)
153 {
154 $strImportErrorMessage .= str_replace(
155 "#ERROR#",
156 ($boolVersion ? $oIBlock->LAST_ERROR : GetMessage('CML_R_VERSION')),
157 str_replace(
158 "#NAME#",
159 "[".$currentCatalog["BID"]."] \"".$currentCatalog["Name"]."\" (".$currentCatalog["ID"].")",
160 str_replace("#ACT#", ($bUpdate ? GetMessage("CML_R_EDIT") : GetMessage("CML_R_ADD")), GetMessage("CML_R_IBLOCK"))
161 )
162 ).".<br>";
163 $currentCatalog = false;
164 }
165 else
166 {
167 $boolIBlockTranslit = $USE_TRANSLIT;
168 $boolTranslitElement = false;
169 $boolTranslitSection = false;
170 $arTranslitElement = array();
171 $arTranslitSection = array();
172
173 if ('Y' == $boolIBlockTranslit)
174 {
175 $boolOutTranslit = false;
176 $arIBlock = CIBlock::GetArrayByID($currentCatalog["BID"]);
177 if (isset($arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']))
178 {
179 if ('Y' == $arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']['TRANSLITERATION']
180 && 'Y' == $arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']['USE_GOOGLE'])
181 {
182 $boolOutTranslit = true;
183 }
184 }
185 if (isset($arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']))
186 {
187 if ('Y' == $arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']['TRANSLITERATION']
188 && 'Y' == $arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']['USE_GOOGLE'])
189 {
190 $boolOutTranslit = true;
191 }
192 }
193 if ($boolOutTranslit)
194 {
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;
198 break;
199 }
200
201 if ('Y' == $boolIBlockTranslit)
202 {
203 if (isset($arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']))
204 {
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),
214 );
215 }
216 if (isset($arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']))
217 {
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),
227 );
228 }
229 }
230 }
231
232 $arIBlockCache[$currentCatalog["ID"]] = intval($currentCatalog["BID"]);
233 $iBlockIDString .= ",".intval($currentCatalog["BID"]);
234 if (!CCatalog::GetByID($currentCatalog["BID"]))
235 CCatalog::Add(Array("IBLOCK_ID" => $currentCatalog["BID"]));
236
237 if (function_exists("catalog_1c_mutator_catalogT"))
238 catalog_1c_mutator_catalogT($currentCatalog["BID"], $bUpdate, $attrs);
239 }
240
241 break;
242
243 case $nameUTF["Property"]:
244 if ($currentCatalog)
245 {
246 $currentProperty = array();
247
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"]];
253
254 if ($currentProperty["DataType"] == "enumeration")
255 $currentProperty["DataType"] = "L";
256 else
257 $currentProperty["DataType"] = "S";
258
259 $strSql =
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"])."')";
262
263 $DB->Query($strSql);
264
265 $cmlLoadCnts["PROPERTY"]++;
266 }
267 break;
268
269 case $nameUTF["PropertyVariant"]:
270 if ($currentProperty)
271 {
272 $currentPropertyEnum = array();
273
274 $currentPropertyEnum["ID"] = $attrs[$nameUTF["ID"]];
275 $currentPropertyEnum["Name"] = $attrs[$nameUTF["Name"]];
276 $currentPropertyEnum["Default"] = (($currentProperty["DefaultValue"] == $currentPropertyEnum["ID"]) ? "Y" : "N");
277
278 $strSql =
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"]."')";
281
282 $DB->Query($strSql);
283 }
284 break;
285
286 case $nameUTF["Category"]:
287 if ($currentCatalog)
288 {
289 $currentCategory = array();
290
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);
300
301 $strSql =
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"]))."')";
304
305 $DB->Query($strSql);
306
307 $cmlLoadCnts["SECTION"]++;
308 }
309 break;
310
311 case $nameUTF["Product"]:
312 if ($currentCatalog)
313 {
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);
321
322 $strSql =
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"]))."')";
325
326 $DB->Query($strSql);
327
328 if (function_exists("catalog_1c_mutator_productT"))
329 catalog_1c_mutator_productT($attrs);
330
331 $cmlLoadCnts["PRODUCT"]++;
332
333 if ($currentProduct["ParentCategory"] <> '')
334 {
335 $strSql =
336 "INSERT INTO b_catalog_cml_product_cat (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID) ".
337 "VALUES (".$currentCatalog["BID"].", '".$currentProduct["ID"]."', '".$currentProduct["ParentCategory"]."')";
338
339 $DB->Query($strSql);
340 }
341 }
342 break;
343
344 case $nameUTF["CategoryReference"]:
345 if ($currentProduct)
346 {
347 $strSql =
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"]]."')";
350
351 $DB->Query($strSql);
352 }
353 break;
354
355 case $nameUTF["PropertyValue"]:
356 if ($currentProduct)
357 {
358 $propertyID = $attrs[$nameUTF["PropertyId"]];
359 $propertyValue = $attrs[$nameUTF["Value"]];
360
361 $strSql =
362 "INSERT INTO b_catalog_cml_product_prop (CATALOG_ID, PRODUCT_XML_ID, PROPERTY_XML_ID, PROPERTY_VALUE, PROPERTY_VALUE_TEXT) ".
363 "VALUES (".$currentCatalog["BID"].", '".$currentProduct["ID"]."', '".$propertyID."', '".$DB->ForSql($propertyValue, 255)."', '".$DB->ForSql($propertyValue)."')";
364
365 $DB->Query($strSql);
366 }
367 elseif ($currentOffersList && !$currentOffer)
368 {
369 $priceType = $attrs[$nameUTF["Value"]];
370 $currentOffersList["PRICE_TYPE"] = $priceType;
371
372 $strSql =
373 "INSERT INTO b_catalog_cml_oflist_prop (OFFER_LIST_XML_ID, PROPERTY_VALUE) ".
374 "VALUES (".$currentOffersList["ID"].", '".$DB->ForSql($priceType, 255)."')";
375
376 $DB->Query($strSql);
377 }
378 break;
379
380 case $nameUTF["OffersList"]:
381 $currentOffersList = array();
382 $currentOffersList["CatalogID"] = $attrs[$nameUTF["CatalogID"]];
383 $currentOffersList["Currency"] = $arCMLCurrencies[$attrs[$nameUTF["Currency"]]];
384 if ($currentOffersList["Currency"] == '')
385 $currentOffersList["Currency"] = "USD";
386
387 if (!array_key_exists($currentOffersList["CatalogID"], $arIBlockCache))
388 {
389 $dbIBlockList = CIBlock::GetList(array(), array("XML_ID" => $currentOffersList["CatalogID"]));
390 if ($arIBlock = $dbIBlockList->Fetch())
391 $arIBlockCache[$currentOffersList["CatalogID"]] = intval($arIBlock["ID"]);
392 }
393
394 $strSql =
395 "INSERT INTO b_catalog_cml_oflist(CATALOG_ID) ".
396 "VALUES (".$arIBlockCache[$currentOffersList["CatalogID"]].")";
397
398 $DB->Query($strSql);
399
400 $currentOffersList["ID"] = intval($DB->LastID());
401
402 break;
403
404 case $nameUTF["Offer"]:
405 if ($currentOffersList)
406 {
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"]]);
411 $currentOffer["Currency"] = $arCMLCurrencies[$attrs[$nameUTF["Currency"]]];
412 if ($currentOffer["Currency"] == '')
413 $currentOffer["Currency"] = $currentOffersList["Currency"];
414
415 $strSql =
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"]."')";
418
419 $DB->Query($strSql);
420
421 $cmlLoadCnts["OFFER"]++;
422 }
423
424 break;
425
426 case $nameUTF['CommerceInfo']:
427 if (isset($attrs[$nameUTF['CommerceInfoVersion']]))
428 {
429 $strVersion = (string)$attrs[$nameUTF['CommerceInfoVersion']];
430 if (version_compare($strVersion, '2.0') >= 0)
431 {
432 $strImportErrorMessage .= GetMessage("CICML_INVALID_VERSION")."<br>";
433 }
434 $currentCatalog = false;
435 return false;
436 }
437 break;
438 case $nameUTF['Yandex']:
439 $strImportErrorMessage .= GetMessage('CICML_NO_YANDEX');
440 return false;
441 default:
442 break;
443 }
444 return true;
445}
446
447function cmlEndElement($parser, $name)
448{
449 global $DB;
450 global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer;
451 global $arIBlockCache;
452 global $APPLICATION, $nameUTF, $tmpid;
453
454 switch ($name)
455 {
456 case $nameUTF["Catalog"]:
457 $currentCatalog = false;
458 break;
459
460 case $nameUTF["Product"]:
461 $currentProduct = false;
462 break;
463
464 case $nameUTF["Property"]:
465 $currentProperty = false;
466 break;
467
468 case $nameUTF["OffersList"]:
469 if (!array_key_exists("PRICE_TYPE", $currentOffersList) || $currentOffersList["PRICE_TYPE"] == '')
470 {
471 $strSql = "SELECT NAME FROM b_catalog_group WHERE BASE = 'Y'";
472 $dbRes = $DB->Query($strSql);
473 if ($arRes = $dbRes->Fetch())
474 {
475 $priceType = $arRes["NAME"];
476 $currentOffersList["PRICE_TYPE"] = $priceType;
477
478 $strSql =
479 "INSERT INTO b_catalog_cml_oflist_prop (OFFER_LIST_XML_ID, PROPERTY_VALUE) ".
480 "VALUES (".$currentOffersList["ID"].", '".$DB->ForSql($priceType, 255)."')";
481 $DB->Query($strSql);
482 }
483 }
484 else
485 {
486 $strSql = "SELECT count(*) as CNT FROM b_catalog_group WHERE NAME = '".$DB->ForSql($currentOffersList["PRICE_TYPE"])."'";
487 $dbRes = $DB->Query($strSql);
488 if ($arRes = $dbRes->Fetch())
489 {
490 if (intval($arRes["CNT"]) <= 0)
491 {
493 array(
494 "NAME" => $currentOffersList["PRICE_TYPE"],
495 "USER_LANG" => array("ru" => $currentOffersList["PRICE_TYPE"])
496 )
497 );
498 }
499 }
500 }
501 $currentOffersList = false;
502 break;
503
504 case $nameUTF["Offer"]:
505 $currentOffer = false;
506 break;
507 }
508}
509
510function __SetTimeMark($text, $startStop = "")
511{
512 global $bCmlDebug;
513 global $cmlTimeMarkTo, $cmlTimeMarkFrom, $cmlTimeMarkGlobalFrom;
514 global $cmlMemoryMarkTo, $cmlMemoryMarkFrom, $cmlMemoryMarkGlobalFrom;
515
516 //echo " ";
517 //flush();
518
519 if (!$bCmlDebug)
520 return;
521
522 if (mb_strtoupper($startStop) == "START")
523 {
524 $hFile = fopen($_SERVER["DOCUMENT_ROOT"].CML_DEBUG_FILE_NAME, "w");
525 fwrite($hFile, date("H:i:s")." - ".__getMemoryUsage()." - ".$text."\n");
526 fclose($hFile);
527
528 $cmlMemoryMarkGlobalFrom = __getMemoryUsage();
529 $cmlMemoryMarkFrom = __getMemoryUsage();
530 $cmlTimeMarkGlobalFrom = __getMicroTime();
531 $cmlTimeMarkFrom = __getMicroTime();
532 }
533 elseif (mb_strtoupper($startStop) == "STOP")
534 {
535 $cmlTimeMarkTo = __getMicroTime();
536 $cmlMemoryMarkTo = __getMemoryUsage();
537
538 $hFile = fopen($_SERVER["DOCUMENT_ROOT"].CML_DEBUG_FILE_NAME, "a");
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");
541 fclose($hFile);
542 }
543 else
544 {
545 $cmlTimeMarkTo = __getMicroTime();
546 $cmlMemoryMarkTo = __getMemoryUsage();
547
548 $hFile = fopen($_SERVER["DOCUMENT_ROOT"].CML_DEBUG_FILE_NAME, "a");
549 fwrite($hFile, date("H:i:s")." - ".Round($cmlTimeMarkTo - $cmlTimeMarkFrom, 3)." s - ".($cmlMemoryMarkTo - $cmlMemoryMarkFrom)." - ".($cmlMemoryMarkTo - $cmlMemoryMarkGlobalFrom)." - ".$text."\n");
550 fclose($hFile);
551
552 $cmlMemoryMarkFrom = __getMemoryUsage();
553 $cmlTimeMarkFrom = __getMicroTime();
554 }
555}
556
558{
559 list($usec, $sec) = explode(" ", microtime());
560 return ((float)$usec + (float)$sec);
561}
562
564{
565 global $bCmlMemoryDebug;
566
567 if (!$bCmlMemoryDebug)
568 return 0;
569
570 if (function_exists('memory_get_usage'))
571 {
572 return memory_get_usage();
573 }
574
575 return 0;
576}
577
579{
580 global $DB;
581
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");
583
584 $dbRes = $DB->Query("SHOW TABLES");
585 while ($arRes = $dbRes->Fetch())
586 {
587 $arKeys = array_keys($arRes);
588 $tableName = $arRes[$arKeys[0]];
589
590 if (in_array($tableName, $arTables))
591 {
592 foreach ($arTables as $key => $value)
593 {
594 if ($value == $tableName)
595 {
596 unset($arTables[$key]);
597 break;
598 }
599 }
600 }
601 }
602
603 foreach ($arTables as $key => $value)
604 {
605 if ($value == "b_catalog_cml_property")
606 {
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))");
615 }
616 elseif ($value == "b_catalog_cml_property_var")
617 {
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))");
625 }
626 elseif ($value == "b_catalog_cml_section")
627 {
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,
633 CODE varchar(255),
634 primary key (CATALOG_ID, XML_ID))");
635 }
636 elseif ($value == "b_catalog_cml_product")
637 {
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,
644 CODE varchar(255),
645 primary key (CATALOG_ID, XML_ID))");
646 }
647 elseif ($value == "b_catalog_cml_product_cat")
648 {
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))");
654 }
655 elseif ($value == "b_catalog_cml_product_prop")
656 {
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))");
664 }
665 elseif ($value == "b_catalog_cml_oflist")
666 {
667 $DB->Query("create table b_catalog_cml_oflist (
668 ID int(11) not null auto_increment,
669 CATALOG_ID int(11) not null,
670 primary key (ID),
671 index IXS_CAT_CML_OL (CATALOG_ID))");
672 }
673 elseif ($value == "b_catalog_cml_oflist_prop")
674 {
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))");
679 }
680 elseif ($value == "b_catalog_cml_offer")
681 {
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))");
689 }
690 elseif ($value == "b_catalog_cml_tmp")
691 {
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,
696 VALUE_ID int(11),
697 primary key (CATALOG_ID, XML_ID),
698 index IXS_CAT_CML_TMP (ID))");
699 }
700 }
701}
702/************************ END FUNCTIONS *******************************/
703
704
705
706if ($strImportErrorMessage == '')
707{
708 $DATA_FILE_NAME = "";
709
710 if (isset($_FILES["FILE_1C"]) && is_uploaded_file($_FILES["FILE_1C"]["tmp_name"]))
711 $DATA_FILE_NAME = $_FILES["FILE_1C"]["tmp_name"];
712
713 if ($DATA_FILE_NAME == '')
714 {
715 if ($URL_FILE_1C <> '')
716 {
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))
719 $DATA_FILE_NAME = $_SERVER["DOCUMENT_ROOT"].$URL_FILE_1C;
720 }
721 }
722
723 if ($DATA_FILE_NAME == '')
724 $strImportErrorMessage .= GetMessage("CICML_NO_LOAD_FILE")."<br>";
725
726 global $IBLOCK_TYPE_ID;
727 $IBLOCK_TYPE_ID = trim(strval($IBLOCK_TYPE_ID));
728 if ($IBLOCK_TYPE_ID <> '')
729 {
731 if (!($arIBlockType = $rsIBlockTypes->Fetch()))
732 {
733 $IBLOCK_TYPE_ID = '';
734 }
735 }
736 if ($IBLOCK_TYPE_ID == '')
737 {
738 $IBLOCK_TYPE_ID = COption::GetOptionString("catalog", "default_catalog_1c", "");
739 }
740 if ($IBLOCK_TYPE_ID == '')
741 {
742 ClearVars('f_');
743 $iblocks = CIBlockType::GetList(array('SORT' => 'ASC'));
744 if ($iblocks->ExtractFields("f_"))
745 $IBLOCK_TYPE_ID = $f_ID;
746 }
747 if ($IBLOCK_TYPE_ID == '')
748 $strImportErrorMessage .= GetMessage("CICML_NO_IBLOCK")."<br>";
749
750 if ($keepExistingProperties != "Y" && $keepExistingProperties != "N")
751 $keepExistingProperties = COption::GetOptionString("catalog", "keep_existing_properties", (CML_KEEP_EXISTING_PROPERTIES ? "Y" : "N"));
752 $bKeepExistingProperties = (($keepExistingProperties == "Y") ? true : false);
753
754 if ($keepExistingData != "Y" && $keepExistingData != "N")
755 $keepExistingData = COption::GetOptionString("catalog", "keep_existing_data", (CML_KEEP_EXISTING_DATA ? "Y" : "N"));
756// $bKeepExistingData = (($keepExistingData == "Y") ? true : false);
757
758 if ($activateFileData != "Y" && $activateFileData != "N")
759 $activateFileData = COption::GetOptionString("catalog", "activate_file_data", (CML_ACTIVATE_FILE_DATA ? "Y" : "N"));
760 $bActivateFileData = (($activateFileData == "Y") ? true : false);
761
762 if ($deleteComments != "Y" && $deleteComments != "N")
763 $deleteComments = (CML_DELETE_COMMENTS ? "Y" : "N");
764 $bDeleteComments = (($deleteComments == "Y") ? true : false);
765
766 global $bCmlDebug;
767 if ($cmlDebug != "Y" && $cmlDebug != "N")
768 $cmlDebug = (CML_DEBUG ? "Y" : "N");
769 $bCmlDebug = (($cmlDebug == "Y") ? true : false);
770
771 global $bCmlMemoryDebug;
772 if ($cmlMemoryDebug != "Y" && $cmlMemoryDebug != "N")
773 $cmlMemoryDebug = (CML_MEMORY_DEBUG ? "Y" : "N");
774 $bCmlMemoryDebug = (($cmlMemoryDebug == "Y") ? true : false);
775
776 global $arCMLCurrencies;
778 include(__DIR__.'/ru/commerceml_g_run_cur.php');
779 if (!isset($arCMLCurrencies) || !is_array($arCMLCurrencies) || empty($arCMLCurrencies))
780 $strImportErrorMessage .= GetMessage('CAT_ADM_CML1_IMP_ERR_CMLCUR').'<br>';
781
782 global $nameUTF;
783 $nameUTF = array();
784 include(__DIR__.'/ru/commerceml_g_run_name.php');
785 if (!isset($nameUTF) || !is_array($nameUTF) || empty($nameUTF))
786 $strImportErrorMessage .= GetMessage('CAT_ADM_CML1_IMP_ERR_NAMEUTF').'<br>';
787
788 global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer;
789 $currentCatalog = false;
790 $currentProduct = false;
791 $currentProperty = false;
792 $currentOffersList = false;
793 $currentOffer = false;
794
795 global $arIBlockCache, $iBlockIDString;
796 $arIBlockCache = array();
797 $iBlockIDString = "0";
798
799 global $cmlLoadCnts;
800 $cmlLoadCnts = array();
801 $cmlLoadCnts["CATALOG"] = 0;
802 $cmlLoadCnts["PROPERTY"] = 0;
803 $cmlLoadCnts["SECTION"] = 0;
804 $cmlLoadCnts["PRODUCT"] = 0;
805 $cmlLoadCnts["OFFER"] = 0;
806
808 $USE_TRANSLIT = (isset($USE_TRANSLIT) && 'Y' == $USE_TRANSLIT ? 'Y' : 'N');
809 $ADD_TRANSLIT = (isset($ADD_TRANSLIT) && 'Y' == $ADD_TRANSLIT ? 'Y' : 'N');
810
811 $boolIBlockTranslit = $USE_TRANSLIT;
812 $boolTranslitElement = false;
813 $boolTranslitSection = false;
814 $arTranslitElement = array();
815 $arTranslitSection = array();
816
817 __SetTimeMark("Start", "START");
818
820
821 __SetTimeMark("Create temp tables");
822
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");
833
834 __SetTimeMark("Clear temp tables");
835
836 global $oIBlock;
837 $oIBlock = new CIBlock();
838
839 global $tmpid;
840 $tmpid = md5(uniqid(""));
841
842 $xmlData = file_get_contents($DATA_FILE_NAME);
843
844 __SetTimeMark("Get contents");
845 if ($pe = mb_strpos($xmlData, ">"))
846 {
847 $headerString = mb_substr($xmlData, 0, $pe);
848 if(preg_match('#encoding[\s]*=[\s]*"(.*?)"#i', $headerString, $arMatch))
849 {
850 $xmlData = \Bitrix\Main\Text\Encoding::convertEncoding($xmlData, $arMatch[1], LANG_CHARSET);
851 }
852 }
853
854 __SetTimeMark("Convert");
855
856 if ($bDeleteComments)
857 {
858 $xmlData = preg_replace("#<\!--.*?-->#s", "", $xmlData);
859 __SetTimeMark("Delete comments");
860 }
861
862 $search = array(
863 "'&(quot|#34);'i",
864 "'&(amp|#38);'i",
865 "'&(lt|#60);'i",
866 "'&(gt|#62);'i",
867 "'&#(\d+);'e"
868 );
869
870 $replace = array(
871 "\"",
872 "&",
873 "<",
874 ">",
875 "chr(\\1)"
876 );
877
878 $pb = mb_strpos($xmlData, "<");
879 while ($pb !== false)
880 {
881 $pe = mb_strpos($xmlData, ">", $pb);
882 if($pe === false)
883 break;
884
885 $tag_cont = mb_substr($xmlData, $pb + 1, $pe - $pb - 1);
886 $pb = mb_strpos($xmlData, "<", $pe);
887
888 $check_str = mb_substr($tag_cont, 0, 1);
889 if($check_str=="?")
890 continue;
891 elseif($check_str=="!")
892 continue;
893 elseif($check_str=="/")
894 cmlEndElement(false, mb_substr($tag_cont, 1));
895 else
896 {
897 $p = 0;
898 $ltag_cont = mb_strlen($tag_cont);
899 while(($p < $ltag_cont) && (mb_strpos(" \t\n\r", mb_substr($tag_cont, $p, 1)) === false))
900 $p++;
901 $name = mb_substr($tag_cont, 0, $p);
902 $at = mb_substr($tag_cont, $p);
903 if (mb_strpos($at, "&") !== false)
904 $bAmp = true;
905 else
906 $bAmp = false;
907
908 preg_match_all("/(\\S+)\\s*=\\s*[\"](.*?)[\"]/su", $at, $attrs_tmp);
909 $attrs = array();
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]);
912 if (!cmlStartElement(false, $name, $attrs))
913 break;
914 if(mb_substr($tag_cont, -1) === "/")
915 cmlEndElement(false, $name);
916 }
917 }
918
919 $xmlData = "";
920 __SetTimeMark("Parse");
921}
922
923if ($strImportErrorMessage == '')
924{
925 // If there are catalogs in CommerceML data file
926 if ($iBlockIDString != "0")
927 {
928 /***************************** PROPERTIES *******************************************/
929 // Collect properties temp table
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) ";
933 $DB->Query($strSql);
934
935 // Add new properties
936 $strSql =
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) ".
941 "WHERE T.ID = 0 ";
942 $DB->Query($strSql);
943
944 // Update properties
945 $strSql =
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) ".
950 "WHERE T.ID > 0 ";
951 $dbRes = $DB->Query($strSql);
952 while ($arRes = $dbRes->Fetch())
953 {
954 $strSql =
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"]." ";
962 $DB->Query($strSql);
963 }
964
965 // Clear temp table
966 $DB->Query("TRUNCATE TABLE b_catalog_cml_tmp");
967
968 __SetTimeMark("Process properties");
969
970 /****************** Property variants *************************************/
971 // Collect property variants temp table
972 $strSql =
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) ";
978 $DB->Query($strSql);
979
980 // Add new property variants
981 $strSql =
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) ".
986 "WHERE T.ID = 0 ";
987 $DB->Query($strSql);
988
989 // Update property variants
990 $strSql =
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) ".
995 "WHERE T.ID > 0 ";
996 $dbRes = $DB->Query($strSql);
997 while ($arRes = $dbRes->Fetch())
998 {
999 $strSql =
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);
1006 }
1007
1008 // Clear temp table
1009 $DB->Query("TRUNCATE TABLE b_catalog_cml_tmp");
1010
1011 if (function_exists("catalog_1c_mutator_property"))
1012 catalog_1c_mutator_property($iBlockIDString);
1013
1014 __SetTimeMark("Process properties variants");
1015
1016 /***************************** Sections ****************************************/
1017 // Collect sections temp table
1018 $strSql =
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);
1023
1024 // Delete old sections
1025 if ($keepExistingData == "N")
1026 {
1027 $num = 0;
1028 $sectionIDs = "0";
1029 $arPropsCache = array();
1030
1031 $strSql =
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";
1036 $dbRes = $DB->Query($strSql);
1037 while ($arRes = $dbRes->Fetch())
1038 {
1039 $num++;
1040 $sectionIDs .= ",".$arRes["ID"];
1041
1042 if (!array_key_exists($arRes["IBLOCK_ID"], $arPropsCache))
1043 {
1044 $arPropsCache[$arRes["IBLOCK_ID"]] = "0";
1045 $strSql =
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())
1049 {
1050 $arPropsCache[$arRes["IBLOCK_ID"]] .= ",".$arRes1["ID"];
1051 }
1052 }
1053
1054 if ($num > CML_GROUP_OPERATION_CNT)
1055 {
1056 $strSql = "DELETE FROM b_catalog_discount2section WHERE SECTION_ID IN (".$sectionIDs.")";
1057 $DB->Query($strSql);
1058
1059 $strSql = "UPDATE b_iblock_element SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1060 $DB->Query($strSql);
1061
1062 $strSql = "DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1063 $DB->Query($strSql);
1064
1065 $strSql = "UPDATE b_iblock_section SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1066 $DB->Query($strSql);
1067
1068 $strSql = "DELETE FROM b_iblock_section WHERE ID IN (".$sectionIDs.")";
1069 $DB->Query($strSql);
1070
1071 $num = 0;
1072 $sectionIDs = "0";
1073 }
1074
1075 if ($arPropsCache[$arRes["IBLOCK_ID"]] != "0")
1076 {
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);
1079 }
1080 }
1081
1082 if ($num > 0)
1083 {
1084 $strSql = "DELETE FROM b_catalog_discount2section WHERE SECTION_ID IN (".$sectionIDs.")";
1085 $DB->Query($strSql);
1086
1087 $strSql = "UPDATE b_iblock_element SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1088 $DB->Query($strSql);
1089
1090 $strSql = "DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1091 $DB->Query($strSql);
1092
1093 $strSql = "UPDATE b_iblock_section SET IBLOCK_SECTION_ID = NULL WHERE IBLOCK_SECTION_ID IN (".$sectionIDs.")";
1094 $DB->Query($strSql);
1095
1096 $strSql = "DELETE FROM b_iblock_section WHERE ID IN (".$sectionIDs.")";
1097 $DB->Query($strSql);
1098
1099 $strSql = "DELETE FROM b_iblock_element_property WHERE VALUE_NUM IN (".$sectionIDs.")";
1100 $DB->Query($strSql);
1101 }
1102 }
1103 else
1104 {
1105
1106 }
1107
1108 // Update sections
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) ".
1111 "WHERE T.ID > 0 ";
1112 $dbRes = $DB->Query($strSql);
1113 while ($arRes = $dbRes->Fetch())
1114 {
1115 $strSql =
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);
1123 }
1124
1125 // Add new sections
1126 $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) ".
1131 "WHERE T.ID = 0 ";
1132 $DB->Query($strSql);
1133
1134 // Update section parent links
1135 $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) ";
1140 $dbRes = $DB->Query($strSql);
1141 while ($arRes = $dbRes->Fetch())
1142 {
1143 $strSql =
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);
1148 }
1149
1150 // ReSort sections
1151 function ReSort($iblockID, $id = 0, $cnt = 0, $depth = 0, $active = "Y")
1152 {
1153 global $DB;
1154 $iblockID = intval($iblockID);
1155
1156 if ($id > 0)
1157 $DB->Query(
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));
1163
1164 $strSql =
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 ";
1170
1171 $cnt++;
1172 $res = $DB->Query($strSql);
1173 while ($arr = $res->Fetch())
1174 $cnt = ReSort($iblockID, $arr["ID"], $cnt, $depth + 1, (($active=="Y" && $arr["ACTIVE"]=="Y") ? "Y" : "N"));
1175
1176 if ($id == 0)
1177 return true;
1178
1179 $DB->Query(
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));
1186 return $cnt + 1;
1187 }
1188
1189 $arIBlockIDString = explode(",", $iBlockIDString);
1190 if (!empty($arIBlockIDString))
1191 {
1192 for ($i = 0, $intIBCount = count($arIBlockIDString); $i < $intIBCount; $i++)
1193 {
1194 if (intval($arIBlockIDString[$i]) == 0)
1195 continue;
1196
1197 ReSort($arIBlockIDString[$i]);
1198 }
1199 }
1200
1201 // Clear temp table
1202 $DB->Query("TRUNCATE TABLE b_catalog_cml_tmp");
1203
1204 if (function_exists("catalog_1c_mutator_section"))
1205 catalog_1c_mutator_section($iBlockIDString);
1206
1207 __SetTimeMark("Process sections");
1208
1209 /***************************** Products ****************************************/
1210 // Collect products temp table
1211 $strSql =
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);
1217
1218 $DB->Query("REPAIR TABLE b_catalog_cml_tmp QUICK", true);
1219
1220 __SetTimeMark("Process products - temp table");
1221
1222 // Delete old products
1223 if ($keepExistingData == "N")
1224 {
1225 $num = 0;
1226 $productIDs = "0";
1227
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";
1230 $dbRes = $DB->Query($strSql);
1231 while ($arRes = $dbRes->Fetch())
1232 {
1233 $num++;
1234 $productIDs .= ",".$arRes["ID"];
1235
1236 if ($num > CML_GROUP_OPERATION_CNT)
1237 {
1238 $strSql = "DELETE FROM b_catalog_discount2product WHERE PRODUCT_ID IN (".$productIDs.")";
1239 $DB->Query($strSql);
1240
1241 $strSql = "DELETE FROM b_catalog_price WHERE PRODUCT_ID IN (".$productIDs.")";
1242 $DB->Query($strSql);
1243
1244 $strSql = "DELETE FROM b_catalog_product2group WHERE PRODUCT_ID IN (".$productIDs.")";
1245 $DB->Query($strSql);
1246
1247 $strSql = "DELETE FROM b_catalog_product WHERE ID IN (".$productIDs.")";
1248 $DB->Query($strSql);
1249
1250 $strSql = "DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1251 $DB->Query($strSql);
1252
1253 $strSql = "DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1254 $DB->Query($strSql);
1255
1256 $strSql = "DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1257 $DB->Query($strSql, true);
1258
1259 $strSql = "DELETE FROM b_iblock_element WHERE ID IN (".$productIDs.")";
1260 $DB->Query($strSql);
1261
1262 $num = 0;
1263 $productIDs = "0";
1264 }
1265 }
1266
1267 if ($num > 0)
1268 {
1269 $strSql = "DELETE FROM b_catalog_discount2product WHERE PRODUCT_ID IN (".$productIDs.")";
1270 $DB->Query($strSql);
1271
1272 $strSql = "DELETE FROM b_catalog_price WHERE PRODUCT_ID IN (".$productIDs.")";
1273 $DB->Query($strSql);
1274
1275 $strSql = "DELETE FROM b_catalog_product2group WHERE PRODUCT_ID IN (".$productIDs.")";
1276 $DB->Query($strSql);
1277
1278 $strSql = "DELETE FROM b_catalog_product WHERE ID IN (".$productIDs.")";
1279 $DB->Query($strSql);
1280
1281 $strSql = "DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1282 $DB->Query($strSql);
1283
1284 $strSql = "DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1285 $DB->Query($strSql);
1286
1287 $strSql = "DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.")";
1288 $DB->Query($strSql, true);
1289
1290 $strSql = "DELETE FROM b_iblock_element WHERE ID IN (".$productIDs.")";
1291 $DB->Query($strSql);
1292 }
1293
1294 // From workflow
1295 $num = 0;
1296 $productIDs = "0";
1297
1298 $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 ";
1305 $dbRes = $DB->Query($strSql);
1306 while ($arRes = $dbRes->Fetch())
1307 {
1308 $num++;
1309 $productIDs .= ",".$arRes["ID"];
1310
1311 if ($num > CML_GROUP_OPERATION_CNT)
1312 {
1313 $strSql =
1314 "DELETE FROM b_catalog_discount2product ".
1315 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1316 $DB->Query($strSql);
1317
1318 $strSql =
1319 "DELETE FROM b_catalog_price ".
1320 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1321 $DB->Query($strSql);
1322
1323 $strSql =
1324 "DELETE FROM b_catalog_product2group ".
1325 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1326 $DB->Query($strSql);
1327
1328 $strSql =
1329 "DELETE FROM b_catalog_product ".
1330 "WHERE ID IN (".$productIDs.") ";
1331 $DB->Query($strSql);
1332
1333 $strSql =
1334 "DELETE FROM b_iblock_element_property ".
1335 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1336 $DB->Query($strSql);
1337
1338 $strSql =
1339 "DELETE FROM b_iblock_section_element ".
1340 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1341 $DB->Query($strSql);
1342
1343 $strSql =
1344 "DELETE FROM b_workflow_move ".
1345 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1346 $DB->Query($strSql, true);
1347
1348 $strSql =
1349 "DELETE FROM b_iblock_element ".
1350 "WHERE ID IN (".$productIDs.") ";
1351 $DB->Query($strSql);
1352
1353 $num = 0;
1354 $productIDs = "0";
1355 }
1356 }
1357
1358 if ($num > 0)
1359 {
1360 $strSql =
1361 "DELETE FROM b_catalog_discount2product ".
1362 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1363 $DB->Query($strSql);
1364
1365 $strSql =
1366 "DELETE FROM b_catalog_price ".
1367 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1368 $DB->Query($strSql);
1369
1370 $strSql =
1371 "DELETE FROM b_catalog_product2group ".
1372 "WHERE PRODUCT_ID IN (".$productIDs.") ";
1373 $DB->Query($strSql);
1374
1375 $strSql =
1376 "DELETE FROM b_catalog_product ".
1377 "WHERE ID IN (".$productIDs.") ";
1378 $DB->Query($strSql);
1379
1380 $strSql =
1381 "DELETE FROM b_iblock_element_property ".
1382 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1383 $DB->Query($strSql);
1384
1385 $strSql =
1386 "DELETE FROM b_iblock_section_element ".
1387 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1388 $DB->Query($strSql);
1389
1390 $strSql =
1391 "DELETE FROM b_workflow_move ".
1392 "WHERE IBLOCK_ELEMENT_ID IN (".$productIDs.") ";
1393 $DB->Query($strSql, true);
1394
1395 $strSql =
1396 "DELETE FROM b_iblock_element ".
1397 "WHERE ID IN (".$productIDs.") ";
1398 $DB->Query($strSql);
1399 }
1400 }
1401
1402 __SetTimeMark("Process products - delete old");
1403
1404 // Update products
1405 $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) ".
1412 "WHERE T.ID > 0 ".
1413 "GROUP BY T.ID, X.NAME, X.MODIFIED_BY, X.CODE, S.ID";
1414 $dbRes = $DB->Query($strSql);
1415 while ($arRes = $dbRes->Fetch())
1416 {
1417 $strSql =
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);
1429 }
1430
1431 __SetTimeMark("Process products - update");
1432
1433 // Add new products
1434 $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) ".
1442 "WHERE T.ID = 0 ".
1443 "GROUP BY T.CATALOG_ID, X.MODIFIED_BY, X.NAME, X.XML_ID, X.CODE, S.ID";
1444 $DB->Query($strSql);
1445
1446 __SetTimeMark("Process products - insert");
1447
1448 /************************ Products 2 sections ***********************************/
1449
1450 // Delete parent sections links, delete import offer lists, delete import properties
1451 $catalogGroupsString = "0";
1452 $strSql =
1453 "SELECT CG.ID ".
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) ";
1457 $dbRes = $DB->Query($strSql);
1458 while ($arRes = $dbRes->Fetch())
1459 $catalogGroupsString .= ",".$arRes["ID"];
1460
1461 $catalogPropertiesString = "0";
1462 $strSql =
1463 "SELECT P.ID ".
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) ";
1466 $dbRes = $DB->Query($strSql);
1467 while ($arRes = $dbRes->Fetch())
1468 $catalogPropertiesString .= ",".$arRes["ID"];
1469
1470
1471 $num = 0;
1472 $productIDs = "0";
1473
1474 $strSql =
1475 "SELECT P.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) ";
1478 $dbRes = $DB->Query($strSql);
1479 while ($arRes = $dbRes->Fetch())
1480 {
1481 $num++;
1482 $productIDs .= ",".$arRes["ID"];
1483
1484 if ($num > CML_GROUP_OPERATION_CNT)
1485 {
1486 $strSql =
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);
1491
1492 $strSql =
1493 "DELETE FROM b_catalog_price ".
1494 "WHERE PRODUCT_ID IN (".$productIDs.") ".
1495 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.")";
1496 $DB->Query($strSql);
1497
1498 $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);
1503
1504 $num = 0;
1505 $productIDs = "0";
1506 }
1507 }
1508
1509 if ($num > 0)
1510 {
1511 $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);
1516
1517 $strSql =
1518 "DELETE FROM b_catalog_price ".
1519 "WHERE PRODUCT_ID IN (".$productIDs.") ".
1520 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.")";
1521 $DB->Query($strSql);
1522
1523 $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);
1528 }
1529
1530 __SetTimeMark("Process products groups - delete old");
1531
1532 // Add product parent links
1533 $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);
1541
1542 __SetTimeMark("Process products groups");
1543
1544 /************************ Product properties values ***********************************/
1545
1546 // Add product property values
1547 $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);
1556
1557 __SetTimeMark("Process products properties - insert");
1558
1559 $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);
1569
1570 __SetTimeMark("Process products properties - insert enum");
1571
1572 // Clear temp table
1573 $DB->Query("TRUNCATE TABLE b_catalog_cml_tmp");
1574
1575 if (function_exists("catalog_1c_mutator_product"))
1576 catalog_1c_mutator_product($iBlockIDString);
1577
1578 __SetTimeMark("Process products properties");
1579
1580 /***************************** Offers ****************************************/
1581
1582 // Collect offers temp table
1583 $strSql =
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);
1590
1591 $DB->Query("REPAIR TABLE b_catalog_cml_tmp QUICK", true);
1592
1593 __SetTimeMark("Process offers - temp table");
1594
1595 // Update catalog products
1596 $strSql =
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) ".
1601 "WHERE T.ID > 0 ".
1602 "GROUP BY T.ID";
1603 $dbRes = $DB->Query($strSql);
1604 while ($arRes = $dbRes->Fetch())
1605 {
1606 $strSql =
1607 "UPDATE b_catalog_product SET ".
1608 " QUANTITY = ".intval($arRes["CNT"])." ".
1609 "WHERE ID = ".$arRes["ID"]." ";
1610 $DB->Query($strSql);
1611 }
1612
1613 __SetTimeMark("Process offers - update products");
1614
1615 // Add new catalog products
1616 $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) ".
1622 "WHERE T.ID = 0 ".
1623 "GROUP BY T.VALUE_ID";
1624 $DB->Query($strSql);
1625
1626 __SetTimeMark("Process offers - insert products");
1627
1628 // Add offers
1629 $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);
1639
1640 if (function_exists("catalog_1c_mutator_offer"))
1641 catalog_1c_mutator_offer($iBlockIDString, $catalogGroupsString);
1642
1643 __SetTimeMark("Process offers");
1644
1645 /*************************** Delete old properties *********************************/
1646
1647 if (!$bKeepExistingProperties && ($keepExistingData == "N"))
1648 {
1649 $num = 0;
1650 $propertyIDs = "0";
1651
1652 $strSql =
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 ";
1658 $dbRes = $DB->Query($strSql);
1659 while ($arRes = $dbRes->Fetch())
1660 {
1661 $num++;
1662 $propertyIDs .= ",".$arRes["ID"];
1663
1664 if ($num > CML_GROUP_OPERATION_CNT)
1665 {
1666 $strSql =
1667 "DELETE FROM b_iblock_element_property ".
1668 "WHERE IBLOCK_PROPERTY_ID IN (".$propertyIDs.") ";
1669 $DB->Query($strSql);
1670
1671 $strSql =
1672 "DELETE FROM b_iblock_property_enum ".
1673 "WHERE PROPERTY_ID IN (".$propertyIDs.") ";
1674 $DB->Query($strSql);
1675
1676 $strSql =
1677 "DELETE FROM b_iblock_section_element ".
1678 "WHERE ADDITIONAL_PROPERTY_ID IN (".$propertyIDs.") ";
1679 $DB->Query($strSql);
1680
1681 $strSql =
1682 "DELETE FROM b_iblock_property ".
1683 "WHERE ID IN (".$propertyIDs.") ";
1684 $DB->Query($strSql);
1685
1686 $num = 0;
1687 $productIDs = "0";
1688 }
1689 }
1690
1691 if ($num > 0)
1692 {
1693 $strSql =
1694 "DELETE FROM b_iblock_element_property ".
1695 "WHERE IBLOCK_PROPERTY_ID IN (".$propertyIDs.") ";
1696 $DB->Query($strSql);
1697
1698 $strSql =
1699 "DELETE FROM b_iblock_property_enum ".
1700 "WHERE PROPERTY_ID IN (".$propertyIDs.") ";
1701 $DB->Query($strSql);
1702
1703 $strSql =
1704 "DELETE FROM b_iblock_section_element ".
1705 "WHERE ADDITIONAL_PROPERTY_ID IN (".$propertyIDs.") ";
1706 $DB->Query($strSql);
1707
1708 $strSql =
1709 "DELETE FROM b_iblock_property ".
1710 "WHERE ID IN (".$propertyIDs.") ";
1711 $DB->Query($strSql);
1712 }
1713 }
1714
1715 __SetTimeMark("Process old properties");
1716 }
1717 else
1718 {
1719 // Collect offers temp table
1720 $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);
1728
1729 $DB->Query("REPAIR TABLE b_catalog_cml_tmp QUICK", true);
1730
1731 __SetTimeMark("Process offers - temp table");
1732
1733 // Update catalog products
1734 $strSql =
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) ".
1739 "WHERE T.ID > 0 ".
1740 "GROUP BY T.ID";
1741 $dbRes = $DB->Query($strSql);
1742 while ($arRes = $dbRes->Fetch())
1743 {
1744 $strSql =
1745 "UPDATE b_catalog_product SET ".
1746 " QUANTITY = ".intval($arRes["CNT"])." ".
1747 "WHERE ID = ".$arRes["ID"]." ";
1748 $DB->Query($strSql);
1749 }
1750
1751 __SetTimeMark("Process offers - update products");
1752
1753 // Add new catalog products
1754 $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) ".
1760 "WHERE T.ID = 0 ".
1761 "GROUP BY T.VALUE_ID";
1762 $DB->Query($strSql);
1763
1764 __SetTimeMark("Process offers - insert products");
1765
1766 // Delete import offer lists
1767 $catalogGroupsString = "0";
1768 $strSql =
1769 "SELECT CG.ID ".
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) ";
1773 $dbRes = $DB->Query($strSql);
1774 while ($arRes = $dbRes->Fetch())
1775 $catalogGroupsString .= ",".$arRes["ID"];
1776
1777 $num = 0;
1778 $productIDs = "0";
1779
1780 $strSql =
1781 "SELECT T.VALUE_ID ".
1782 "FROM b_catalog_cml_tmp T ";
1783 $dbRes = $DB->Query($strSql);
1784 while ($arRes = $dbRes->Fetch())
1785 {
1786 $num++;
1787 $productIDs .= ",".$arRes["VALUE_ID"];
1788
1789 if ($num > CML_GROUP_OPERATION_CNT)
1790 {
1791 $strSql =
1792 "DELETE FROM b_catalog_price ".
1793 "WHERE PRODUCT_ID IN (".$productIDs.") ".
1794 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.")";
1795 $DB->Query($strSql);
1796
1797 $num = 0;
1798 $productIDs = "0";
1799 }
1800 }
1801
1802 if ($num > 0)
1803 {
1804 $strSql =
1805 "DELETE FROM b_catalog_price ".
1806 "WHERE PRODUCT_ID IN (".$productIDs.") ".
1807 " AND CATALOG_GROUP_ID IN (".$catalogGroupsString.")";
1808 $DB->Query($strSql);
1809 }
1810
1811 __SetTimeMark("Process offers - delete offers");
1812
1813 // Add offers
1814 $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);
1823
1824 if (function_exists("catalog_1c_mutator_offer"))
1825 catalog_1c_mutator_offer($iBlockIDString, $catalogGroupsString);
1826
1827 __SetTimeMark("Process offers");
1828 }
1829
1830 /***************************** Final clearing ****************************************/
1831
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");
1842
1843 if (function_exists("catalog_1c_mutator_final"))
1844 catalog_1c_mutator_final($iBlockIDString);
1845
1846 __SetTimeMark("Clear temp tables", "STOP");
1847}
1848
1849if ($strImportErrorMessage == '')
1850{
1851 $totalExecutionTime = RoundEx(microtime(true) - $startImportExecTime, 1);
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>";
1854 $strImportOKMessage .= str_replace("#NUM#", $cmlLoadCnts["CATALOG"], GetMessage("CML_R_NCATA"))."<br> ";
1855 $strImportOKMessage .= str_replace("#NUM#", $cmlLoadCnts["PROPERTY"], GetMessage("CML_R_NPROP"))."<br> ";
1856 $strImportOKMessage .= str_replace("#NUM#", $cmlLoadCnts["SECTION"], GetMessage("CML_R_NGRP"))."<br> ";
1857 $strImportOKMessage .= str_replace("#NUM#", $cmlLoadCnts["PRODUCT"], GetMessage("CML_R_NPRD"))."<br> ";
1858 $strImportOKMessage .= str_replace("#NUM#", $cmlLoadCnts["OFFER"], GetMessage("CML_R_NOFF"))."<br> ";
1859}
1860
1862{
1863 if (isset($USER_TMP))
1864 {
1865 $USER = $USER_TMP;
1866 unset($USER_TMP);
1867 }
1868}
global $APPLICATION
Определения include.php:80
$rsIBlockTypes
Определения options.php:1978
static markAsInvalid($iblockId)
Определения manager.php:125
static convertEncoding($data, $charsetFrom, $charsetTo)
Определения encoding.php:17
static Add($arFields)
Определения catalog.php:1209
static GetByID($ID)
Определения catalog.php:281
static IsUserExists()
Определения catalog.php:1812
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
Определения option.php:8
static Add($arFields)
Определения cataloggroup.php:9
static GetList($arOrder=array("SORT"=> "ASC"), $arFilter=array())
Определения iblocktype.php:53
static GetByID($ID)
Определения iblocktype.php:220
$content
Определения commerceml.php:144
const CML_DEBUG
Определения commerceml_g_run.php:5
const CML_MEMORY_DEBUG
Определения commerceml_g_run.php:6
const CML_DELETE_COMMENTS
Определения commerceml_g_run.php:11
const CML_ACTIVATE_FILE_DATA
Определения commerceml_g_run.php:15
__getMicroTime()
Определения commerceml_g_run.php:557
if(!function_exists("file_get_contents")) cmlStartElement($parser, $name, $attrs)
Определения commerceml_g_run.php:51
const CML_DEBUG_FILE_NAME
Определения commerceml_g_run.php:7
cmlEndElement($parser, $name)
Определения commerceml_g_run.php:447
const CML_GROUP_OPERATION_CNT
Определения commerceml_g_run.php:9
$startImportExecTime
Определения commerceml_g_run.php:20
global $strImportOKMessage
Определения commerceml_g_run.php:35
const CML_CLEAR_TEMP_TABLES
Определения commerceml_g_run.php:10
global $strImportErrorMessage
Определения commerceml_g_run.php:35
const CML_KEEP_EXISTING_PROPERTIES
Определения commerceml_g_run.php:13
const CML_KEEP_EXISTING_DATA
Определения commerceml_g_run.php:14
cmlCreateTempTables()
Определения commerceml_g_run.php:578
__getMemoryUsage()
Определения commerceml_g_run.php:563
__SetTimeMark($text, $startStop="")
Определения commerceml_g_run.php:510
$arCMLCurrencies
Определения commerceml_g_run_cur.php:4
if(!function_exists("file_get_contents")) $DATA_FILE_NAME
Определения commerceml_run.php:307
global $nameUTF
Определения commerceml_run.php:402
$activateFileData
Определения commerceml_run.php:400
global $IBLOCK_TYPE_ID
Определения commerceml_run.php:330
$ADD_TRANSLIT
Определения commerceml_run.php:389
if(''===$strImportErrorMessage) if(''===$strImportErrorMessage) $USE_TRANSLIT
Определения commerceml_run.php:388
$arFields
Определения dblapprove.php:5
$filename
Определения file_edit.php:47
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr ><?endif?><? $propertyIndex=0;foreach( $arGlobalProperties as $propertyCode=> $propertyValue
Определения file_new.php:729
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$p
Определения group_list_element_edit.php:23
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
if(preg_match('/^ else[a-z0-9_]{2}$/i', $siteID)===1)
Определения cron_frame.php:23
global $USER
Определения csv_new_run.php:40
$bTmpUserCreated
Определения csv_new_run.php:41
const LANG_CHARSET
Определения include.php:65
ClearVars($prefix="str_")
Определения tools.php:4623
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
Rel2Abs($curdir, $relpath)
Определения tools.php:3297
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$name
Определения menu_edit.php:35
return false
Определения prolog_main_admin.php:185
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$text
Определения template_pdf.php:79
continue
Определения options.php:206
$i
Определения factura.php:643
</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."%"
Определения waybill.php:936
$arRes
Определения options.php:104
$dbRes
Определения yandex_detail.php:168
$arIBlock['PROPERTY']
Определения yandex_detail.php:172
$SITE_ID
Определения yandex_run.php:607