コード例 #1
0
 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"]);
                 }
             }
         }
     }
 }
コード例 #2
0
ファイル: commerceml_run.php プロジェクト: Satariall/izurit
 $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 {
コード例 #3
0
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;
}