public static function Add($SECTION_ID, $PROPERTY_ID, $arLink = array()) { global $DB; $SECTION_ID = intval($SECTION_ID); $PROPERTY_ID = intval($PROPERTY_ID); $rs = $DB->Query("\n\t\t\tSELECT *\n\t\t\tFROM b_iblock_section_property\n\t\t\tWHERE SECTION_ID = " . $SECTION_ID . " AND PROPERTY_ID = " . $PROPERTY_ID . "\n\t\t"); if (!$rs->Fetch()) { $ar = self::CheckProperty($SECTION_ID, $PROPERTY_ID); if (is_array($ar)) { $ar["ID"] = 1; $DB->Add("b_iblock_section_property", $ar); $arUpdate = array(); if (array_key_exists("SMART_FILTER", $arLink)) { $arUpdate["SMART_FILTER"] = $arLink["SMART_FILTER"]; } if (array_key_exists("DISPLAY_TYPE", $arLink)) { $arUpdate["DISPLAY_TYPE"] = $arLink["DISPLAY_TYPE"]; } if (array_key_exists("DISPLAY_EXPANDED", $arLink)) { $arUpdate["DISPLAY_EXPANDED"] = $arLink["DISPLAY_EXPANDED"]; } if (array_key_exists("FILTER_HINT", $arLink)) { $arUpdate["FILTER_HINT"] = $arLink["FILTER_HINT"]; } if (array_key_exists("IBLOCK_ID", $arLink)) { $arUpdate["IBLOCK_ID"] = $arLink["IBLOCK_ID"]; } if (!empty($arUpdate)) { $strUpdate = $DB->PrepareUpdate("b_iblock_section_property", $arUpdate); } else { $strUpdate = ""; } if (strlen($strUpdate) > 0) { $DB->Query("\n\t\t\t\t\t\tUPDATE b_iblock_section_property\n\t\t\t\t\t\tSET " . $strUpdate . "\n\t\t\t\t\t\tWHERE IBLOCK_ID = " . $ar["IBLOCK_ID"] . "\n\t\t\t\t\t\tAND SECTION_ID = " . $ar["SECTION_ID"] . "\n\t\t\t\t\t\tAND PROPERTY_ID = " . $ar["PROPERTY_ID"] . "\n\t\t\t\t\t"); if (array_key_exists("SMART_FILTER", $arUpdate) && $arUpdate["SMART_FILTER"] === "Y" && $arLink["INVALIDATE"] !== "N") { \Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($arUpdate["IBLOCK_ID"] ? $arUpdate["IBLOCK_ID"] : $ar["IBLOCK_ID"]); } } } } }
$tmpid = md5(uniqid("")); $arCatalogs = array(); $arCatalogsParams = array(); $catalogs = $comm[0]->select_nodes("/" . $nameUTF['Catalog']); $ib = new CIBlock(); for ($i = 0, $intCatCount = count($catalogs); $i < $intCatCount; $i++) { $xCatNode = $catalogs[$i]; $IBLOCK_XML_ID = $xCatNode->GetAttribute($nameUTF['ID']); $IBLOCK_NAME = $xCatNode->GetAttribute($nameUTF['Name']); $IBLOCK_DESC = $xCatNode->GetAttribute($nameUTF['Description']); $res = CIBlock::GetList(array(), array("=TYPE" => $IBLOCK_TYPE_ID, "=XML_ID" => $IBLOCK_XML_ID, 'CHECK_PERMISSIONS' => 'Y', 'MIN_PERMISSION' => 'W')); $bNewRecord_tmp = False; if ($res_arr = $res->Fetch()) { $IBLOCK_ID = $res_arr["ID"]; $res = $ib->Update($IBLOCK_ID, array("NAME" => $IBLOCK_NAME, "TMP_ID" => $tmpid, "DESCRIPTION" => $IBLOCK_DESC)); \Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($IBLOCK_ID); } elseif ($USER->IsAdmin()) { $bNewRecord_tmp = True; $arFields = array("ACTIVE" => "Y", "NAME" => $IBLOCK_NAME, "XML_ID" => $IBLOCK_XML_ID, "TMP_ID" => $tmpid, "IBLOCK_TYPE_ID" => $IBLOCK_TYPE_ID, "LID" => $SITE_ID, "WORKFLOW" => "N"); if ('Y' == $USE_TRANSLIT && 'Y' == $ADD_TRANSLIT) { $arFields['FIELDS'] = array('CODE' => array('DEFAULT_VALUE' => array('TRANSLITERATION' => 'Y')), 'SECTION_CODE' => array('DEFAULT_VALUE' => array('TRANSLITERATION' => 'Y'))); } $IBLOCK_ID = $ib->Add($arFields); $res = $IBLOCK_ID > 0; } else { $res = false; } if (!$res) { $strImportErrorMessage .= str_replace("#ERROR#", $ib->LAST_ERROR, str_replace("#NAME#", "[" . $IBLOCK_ID . "] \"" . $IBLOCK_NAME . "\" (" . $IBLOCK_XML_ID . ")", GetMessage("CICML_ERROR_ADDING_CATALOG"))) . ".<br>"; $STT_CATALOG_ERROR++; } else {
function cmlStartElement($parser, $name, $attrs) { global $DB; global $USER; global $currentCatalog, $currentProduct, $currentProperty, $currentOffersList, $currentOffer; global $arIBlockCache, $iBlockIDString, $arCMLCurrencies; global $APPLICATION, $nameUTF, $IBLOCK_TYPE_ID, $strImportErrorMessage; global $oIBlock, $cmlLoadCnts; global $USE_TRANSLIT, $ADD_TRANSLIT; global $boolIBlockTranslit, $boolTranslitElement, $boolTranslitSection, $arTranslitElement, $arTranslitSection; static $SITE_ID = false; if (false === $SITE_ID) { $SITE_ID = 'ru'; $dbSite = CSite::GetByID($SITE_ID); if (!$dbSite->Fetch()) { $by = 'sort'; $order = 'asc'; $dbSite = CSite::GetList($by, $order); $arSite = $dbSite->Fetch(); $SITE_ID = $arSite['ID']; } } switch ($name) { case $nameUTF["Catalog"]: $currentCatalog = array(); if (in_array($nameUTF["ID"], array_keys($attrs))) { $currentCatalog["ID"] = $attrs[$nameUTF["ID"]]; } if (in_array($nameUTF["Name"], array_keys($attrs))) { $currentCatalog["Name"] = $attrs[$nameUTF["Name"]]; } if (in_array($nameUTF["Description"], array_keys($attrs))) { $currentCatalog["Description"] = $attrs[$nameUTF["Description"]]; } $boolVersion = true; $dbIBlockList = CIBlock::GetList(array(), array("=TYPE" => $IBLOCK_TYPE_ID, "=XML_ID" => $currentCatalog["ID"], 'MIN_PERMISSION' => 'W')); if ($arIBlock = $dbIBlockList->Fetch()) { $arIBlock['VERSION'] = intval($arIBlock['VERSION']); if (1 != $arIBlock['VERSION']) { $bUpdate = true; $boolVersion = false; $res = false; } else { $bUpdate = true; $currentCatalog["BID"] = $arIBlock["ID"]; $res = $oIBlock->Update($currentCatalog["BID"], array("NAME" => $currentCatalog["Name"], "DESCRIPTION" => $currentCatalog["Description"])); } \Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($arIBlock["ID"]); } elseif ($USER->IsAdmin()) { $bUpdate = false; $arFields = array("ACTIVE" => "Y", "NAME" => $currentCatalog["Name"], "XML_ID" => $currentCatalog["ID"], "IBLOCK_TYPE_ID" => $IBLOCK_TYPE_ID, "LID" => $SITE_ID, "WORKFLOW" => "N", "VERSION" => 1); if ('Y' == $USE_TRANSLIT && 'Y' == $ADD_TRANSLIT) { $arFields['FIELDS'] = array('CODE' => array('DEFAULT_VALUE' => array('TRANSLITERATION' => 'Y')), 'SECTION_CODE' => array('DEFAULT_VALUE' => array('TRANSLITERATION' => 'Y'))); } $currentCatalog["BID"] = $oIBlock->Add($arFields); $res = $currentCatalog["BID"] > 0; } else { $res = false; } $cmlLoadCnts["CATALOG"]++; if (!$res) { $strImportErrorMessage .= str_replace("#ERROR#", $boolVersion ? $oIBlock->LAST_ERROR : GetMessage('CML_R_VERSION'), 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>"; $currentCatalog = false; } else { $boolIBlockTranslit = $USE_TRANSLIT; $boolTranslitElement = false; $boolTranslitSection = false; $arTranslitElement = array(); $arTranslitSection = array(); if ('Y' == $boolIBlockTranslit) { $boolOutTranslit = false; $arIBlock = CIBlock::GetArrayByID($currentCatalog["BID"]); if (isset($arIBlock['FIELDS']['CODE']['DEFAULT_VALUE'])) { if ('Y' == $arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']['TRANSLITERATION'] && 'Y' == $arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']['USE_GOOGLE']) { $boolOutTranslit = true; } } if (isset($arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE'])) { if ('Y' == $arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']['TRANSLITERATION'] && 'Y' == $arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']['USE_GOOGLE']) { $boolOutTranslit = true; } } if ($boolOutTranslit) { $boolIBlockTranslit = 'N'; $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>"; $currentCatalog = false; break; } if ('Y' == $boolIBlockTranslit) { if (isset($arIBlock['FIELDS']['CODE']['DEFAULT_VALUE'])) { $arTransSettings = $arIBlock['FIELDS']['CODE']['DEFAULT_VALUE']; $boolTranslitElement = 'Y' == $arTransSettings['TRANSLITERATION'] ? true : false; $arTranslitElement = array("max_len" => $arTransSettings['TRANS_LEN'], "change_case" => $arTransSettings['TRANS_CASE'], "replace_space" => $arTransSettings['TRANS_SPACE'], "replace_other" => $arTransSettings['TRANS_OTHER'], "delete_repeat_replace" => 'Y' == $arTransSettings['TRANS_EAT'] ? true : false, "use_google" => 'Y' == $arTransSettings['USE_GOOGLE'] ? true : false); } if (isset($arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE'])) { $arTransSettings = $arIBlock['FIELDS']['SECTION_CODE']['DEFAULT_VALUE']; $boolTranslitSection = 'Y' == $arTransSettings['TRANSLITERATION'] ? true : false; $arTranslitSection = array("max_len" => $arTransSettings['TRANS_LEN'], "change_case" => $arTransSettings['TRANS_CASE'], "replace_space" => $arTransSettings['TRANS_SPACE'], "replace_other" => $arTransSettings['TRANS_OTHER'], "delete_repeat_replace" => 'Y' == $arTransSettings['TRANS_EAT'] ? true : false, "use_google" => 'Y' == $arTransSettings['USE_GOOGLE'] ? true : false); } } } $arIBlockCache[$currentCatalog["ID"]] = IntVal($currentCatalog["BID"]); $iBlockIDString .= "," . IntVal($currentCatalog["BID"]); if (!CCatalog::GetByID($currentCatalog["BID"])) { CCatalog::Add(array("IBLOCK_ID" => $currentCatalog["BID"])); } if (function_exists("catalog_1c_mutator_catalogT")) { catalog_1c_mutator_catalogT($currentCatalog["BID"], $bUpdate, $attrs); } } break; case $nameUTF["Property"]: if ($currentCatalog) { $currentProperty = array(); $currentProperty["ID"] = $attrs[$nameUTF["ID"]]; $currentProperty["DataType"] = $attrs[$nameUTF["DataType"]]; $currentProperty["Multiple"] = $attrs[$nameUTF["Multiple"]] == "1" || $attrs[$nameUTF["Multiple"]] == "Y" ? "Y" : "N"; $currentProperty["Name"] = $attrs[$nameUTF["Name"]]; $currentProperty["DefaultValue"] = $attrs[$nameUTF["DefaultValue"]]; if ($currentProperty["DataType"] == "enumeration") { $currentProperty["DataType"] = "L"; } else { $currentProperty["DataType"] = "S"; } $strSql = "INSERT INTO b_catalog_cml_property (XML_ID, CATALOG_ID, DATA_TYPE, MULTIPLE, NAME, DEFAULT_VALUE) " . "VALUES ('" . $currentProperty["ID"] . "', " . $currentCatalog["BID"] . ", '" . $currentProperty["DataType"] . "', '" . $currentProperty["Multiple"] . "', '" . $DB->ForSql($currentProperty["Name"]) . "', '" . $DB->ForSql($currentProperty["DefaultValue"]) . "')"; $DB->Query($strSql); $cmlLoadCnts["PROPERTY"]++; } break; case $nameUTF["PropertyVariant"]: if ($currentProperty) { $currentPropertyEnum = array(); $currentPropertyEnum["ID"] = $attrs[$nameUTF["ID"]]; $currentPropertyEnum["Name"] = $attrs[$nameUTF["Name"]]; $currentPropertyEnum["Default"] = $currentProperty["DefaultValue"] == $currentPropertyEnum["ID"] ? "Y" : "N"; $strSql = "INSERT INTO b_catalog_cml_property_var (XML_ID, CATALOG_ID, PROPERTY_XML_ID, NAME, DEFAULT_VALUE) " . "VALUES ('" . $currentPropertyEnum["ID"] . "', " . $currentCatalog["BID"] . ", '" . $currentProperty["ID"] . "', '" . $DB->ForSql($currentPropertyEnum["Name"]) . "', '" . $currentPropertyEnum["Default"] . "')"; $DB->Query($strSql); } break; case $nameUTF["Category"]: if ($currentCatalog) { $currentCategory = array(); if (in_array($nameUTF["ID"], array_keys($attrs))) { $currentCategory["ID"] = $attrs[$nameUTF["ID"]]; } if (in_array($nameUTF["Name"], array_keys($attrs))) { $currentCategory["Name"] = $attrs[$nameUTF["Name"]]; } if (in_array($nameUTF["ParentCategory"], array_keys($attrs))) { $currentCategory["ParentCategory"] = $attrs[$nameUTF["ParentCategory"]]; } $currentCategory["Code"] = false; if (true === $boolTranslitSection) { $currentCategory["Code"] = CUtil::translit($currentCategory["Name"], 'ru', $arTranslitSection); } $strSql = "INSERT INTO b_catalog_cml_section (XML_ID, CATALOG_ID, PARENT_XML_ID, NAME, CODE) " . "VALUES ('" . $currentCategory["ID"] . "', " . $currentCatalog["BID"] . ", '" . $currentCategory["ParentCategory"] . "', '" . $DB->ForSql($currentCategory["Name"]) . "', '" . (false === $currentCategory["Code"] ? '' : $DB->ForSql($currentCategory["Code"])) . "')"; $DB->Query($strSql); $cmlLoadCnts["SECTION"]++; } break; case $nameUTF["Product"]: if ($currentCatalog) { $currentProduct = array(); $currentProduct["ID"] = $attrs[$nameUTF["ID"]]; $currentProduct["Name"] = $attrs[$nameUTF["Name"]]; $currentProduct["ParentCategory"] = $attrs[$nameUTF["ParentCategory"]]; $currentProduct["Code"] = false; if (true === $boolTranslitElement) { $currentProduct["Code"] = CUtil::translit($currentProduct["Name"], 'ru', $arTranslitElement); } $strSql = "INSERT INTO b_catalog_cml_product (XML_ID, CATALOG_ID, NAME, MODIFIED_BY, PARENT_CATEGORY, CODE) " . "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"])) . "')"; $DB->Query($strSql); if (function_exists("catalog_1c_mutator_productT")) { catalog_1c_mutator_productT($attrs); } $cmlLoadCnts["PRODUCT"]++; if (strlen($currentProduct["ParentCategory"]) > 0) { $strSql = "INSERT INTO b_catalog_cml_product_cat (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID) " . "VALUES (" . $currentCatalog["BID"] . ", '" . $currentProduct["ID"] . "', '" . $currentProduct["ParentCategory"] . "')"; $DB->Query($strSql); } } break; case $nameUTF["CategoryReference"]: if ($currentProduct) { $strSql = "INSERT INTO b_catalog_cml_product_cat (CATALOG_ID, PRODUCT_XML_ID, CATEGORY_XML_ID) " . "VALUES (" . $currentCatalog["BID"] . ", '" . $currentProduct["ID"] . "', '" . $attrs[$nameUTF["IdInCatalog"]] . "')"; $DB->Query($strSql); } break; case $nameUTF["PropertyValue"]: if ($currentProduct) { $propertyID = $attrs[$nameUTF["PropertyId"]]; $propertyValue = $attrs[$nameUTF["Value"]]; $strSql = "INSERT INTO b_catalog_cml_product_prop (CATALOG_ID, PRODUCT_XML_ID, PROPERTY_XML_ID, PROPERTY_VALUE, PROPERTY_VALUE_TEXT) " . "VALUES (" . $currentCatalog["BID"] . ", '" . $currentProduct["ID"] . "', '" . $propertyID . "', '" . $DB->ForSql($propertyValue, 255) . "', '" . $DB->ForSql($propertyValue) . "')"; $DB->Query($strSql); } elseif ($currentOffersList && !$currentOffer) { $priceType = $attrs[$nameUTF["Value"]]; $currentOffersList["PRICE_TYPE"] = $priceType; $strSql = "INSERT INTO b_catalog_cml_oflist_prop (OFFER_LIST_XML_ID, PROPERTY_VALUE) " . "VALUES (" . $currentOffersList["ID"] . ", '" . $DB->ForSql($priceType, 255) . "')"; $DB->Query($strSql); } break; case $nameUTF["OffersList"]: $currentOffersList = array(); $currentOffersList["CatalogID"] = $attrs[$nameUTF["CatalogID"]]; $currentOffersList["Currency"] = $arCMLCurrencies[$attrs[$nameUTF["Currency"]]]; if (strlen($currentOffersList["Currency"]) <= 0) { $currentOffersList["Currency"] = "USD"; } if (!array_key_exists($currentOffersList["CatalogID"], $arIBlockCache)) { $dbIBlockList = CIBlock::GetList(array(), array("XML_ID" => $currentOffersList["CatalogID"])); if ($arIBlock = $dbIBlockList->Fetch()) { $arIBlockCache[$currentOffersList["CatalogID"]] = IntVal($arIBlock["ID"]); } } $strSql = "INSERT INTO b_catalog_cml_oflist(CATALOG_ID) " . "VALUES (" . $arIBlockCache[$currentOffersList["CatalogID"]] . ")"; $DB->Query($strSql); $currentOffersList["ID"] = IntVal($DB->LastID()); break; case $nameUTF["Offer"]: if ($currentOffersList) { $currentOffer = array(); $currentOffer["ProductId"] = $attrs[$nameUTF["ProductId"]]; $currentOffer["Price"] = DoubleVal(str_replace(",", ".", $attrs[$nameUTF["Price"]])); $currentOffer["Amount"] = IntVal($attrs[$nameUTF["Amount"]]); $currentOffer["Currency"] = $arCMLCurrencies[$attrs[$nameUTF["Currency"]]]; if (strlen($currentOffer["Currency"]) <= 0) { $currentOffer["Currency"] = $currentOffersList["Currency"]; } $strSql = "INSERT INTO b_catalog_cml_offer (OFFER_LIST_XML_ID, PRODUCT_XML_ID, PRICE, AMOUNT, CURRENCY) " . "VALUES ('" . $currentOffersList["ID"] . "', '" . $currentOffer["ProductId"] . "', " . $currentOffer["Price"] . ", " . $currentOffer["Amount"] . ", '" . $currentOffer["Currency"] . "')"; $DB->Query($strSql); $cmlLoadCnts["OFFER"]++; } break; case $nameUTF['CommerceInfo']: if (isset($attrs[$nameUTF['CommerceInfoVersion']])) { $strVersion = (string) $attrs[$nameUTF['CommerceInfoVersion']]; if (version_compare($strVersion, '2.0') >= 0) { $strImportErrorMessage .= GetMessage("CICML_INVALID_VERSION") . "<br>"; } $currentCatalog = false; return false; } break; case $nameUTF['Yandex']: $strImportErrorMessage .= GetMessage('CICML_NO_YANDEX'); return false; default: break; } return true; }