Поддержка серверов

CIBlockCMLImport::ImportSection: метод Битрикс

Постоянная ссылка: http://bxapi.ru/src/?id=170258

<?php 
//    /bitrix/modules/iblock/classes/general/cml2.phpCIBlockCMLImport::ImportSection()
//    4451:

    
function ImportSection($xml_tree_id$IBLOCK_ID$parent_section_id)
    {
        
/** @var CUserTypeManager $USER_FIELD_MANAGER */
        
global $USER_FIELD_MANAGER;
        
/** @var CDatabase $DB */
        
global $DB;

        static 
$arUserFields;
        if(
$parent_section_id === false)
        {
            
$arUserFields = array();
            foreach(
$USER_FIELD_MANAGER->GetUserFields("IBLOCK_".$IBLOCK_ID."_SECTION") as $FIELD_ID => $arField)
            {
                if(
strlen($arField["XML_ID"]) <= 0)
                    
$arUserFields[$FIELD_ID] = $arField;
                else
                    
$arUserFields[$arField["XML_ID"]] = $arField;
            }
        }

        
$this->next_step["section_sort"] += 10;
        
$arSection = array(
            
"IBLOCK_SECTION_ID" => $parent_section_id,
            
"ACTIVE" => "Y",
        );
        
$rsS $this->_xml_file->GetList(
            array(
"ID" => "asc"),
            array(
"PARENT_ID" => $xml_tree_id)
        );
        
$XML_SECTIONS_PARENT false;
        
$XML_PROPERTIES_PARENT false;
        
$XML_SECTION_PROPERTIES false;
        
$deletedStatus false;
        while(
$arS $rsS->Fetch())
        {
            if(isset(
$arS["VALUE_CLOB"]))
                
$arS["VALUE"] = $arS["VALUE_CLOB"];

            if(
$arS["NAME"]==$this->mess["IBLOCK_XML2_ID"])
                
$arSection["XML_ID"] = $arS["VALUE"];
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_NAME"])
                
$arSection["NAME"] = $arS["VALUE"];
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_DESCRIPTION"])
            {
                
$arSection["DESCRIPTION"] = $arS["VALUE"];
                
$arSection["DESCRIPTION_TYPE"] = "html";
            }
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_GROUPS"])
                
$XML_SECTIONS_PARENT $arS["ID"];
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_PROPERTIES_VALUES"])
                
$XML_PROPERTIES_PARENT $arS["ID"];
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_BX_SORT"])
                
$arSection["SORT"] = intval($arS["VALUE"]);
            elseif(
$arS["NAME"]==$this->mess["IBLOCK_XML2_BX_CODE"])
                
$arSection["CODE"] = $arS["VALUE"];
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_BX_PICTURE"])
            {
                if(
strlen($arS["VALUE"]) > 0)
                    
$arSection["PICTURE"] = $this->MakeFileArray($arS["VALUE"]);
                else
                    
$arSection["PICTURE"] = $this->MakeFileArray($this->_xml_file->GetAllChildrenArray($arS["ID"]));
            }
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_BX_DETAIL_PICTURE"])
            {
                if(
strlen($arS["VALUE"]) > 0)
                    
$arSection["DETAIL_PICTURE"] = $this->MakeFileArray($arS["VALUE"]);
                else
                    
$arSection["DETAIL_PICTURE"] = $this->MakeFileArray($this->_xml_file->GetAllChildrenArray($arS["ID"]));
            }
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_BX_ACTIVE"])
                
$arSection["ACTIVE"] = ($arS["VALUE"]=="true") || intval($arS["VALUE"])? "Y""N";
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_SECTION_PROPERTIES"])
                
$XML_SECTION_PROPERTIES $arS["ID"];
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_STATUS"])
                
$deletedStatus $arS["VALUE"] === $this->mess["IBLOCK_XML2_DELETED"];
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_INHERITED_TEMPLATES"])
            {
                
$arSection["IPROPERTY_TEMPLATES"] = array();
                
$arTemplates $this->_xml_file->GetAllChildrenArray($arS["ID"]);
                foreach(
$arTemplates as $TEMPLATE)
                {
                    
$id $TEMPLATE[$this->mess["IBLOCK_XML2_ID"]];
                    
$template $TEMPLATE[$this->mess["IBLOCK_XML2_VALUE"]];
                    if(
strlen($id) > && strlen($template) > 0)
                        
$arSection["IPROPERTY_TEMPLATES"][$id] = $template;
                }
            }
            elseif(
$arS["NAME"] == $this->mess["IBLOCK_XML2_DELETE_MARK"])
            {
                
$arSection["ACTIVE"] = ($arS["VALUE"]=="true") || intval($arS["VALUE"])? "N""Y";
            }
        }

        if (
$deletedStatus)
        {
            
$obSection = new CIBlockSection;
            
$rsSection $obSection->GetList(array(), array(
                
"IBLOCK_ID" => $IBLOCK_ID,
                
"XML_ID" => $arSection["XML_ID"],
            ), 
false, array("ID"));
            if(
$arDBSection $rsSection->Fetch())
            {
                
$obSection->Update($arDBSection["ID"], array(
                    
"ACTIVE" => "N",
                ));
                
$this->_xml_file->Add(array("PARENT_ID" => 0"LEFT_MARGIN" => $arDBSection["ID"]));
            }
            return 
true;
        }

        if(
$XML_PROPERTIES_PARENT)
        {
            
$rs $this->_xml_file->GetList(
                array(
"ID" => "asc"),
                array(
"PARENT_ID" => $XML_PROPERTIES_PARENT),
                array(
"ID")
            );
            while(
$ar $rs->Fetch())
            {
                
$arXMLProp $this->_xml_file->GetAllChildrenArray($ar["ID"]);
                if(
                    
array_key_exists($this->mess["IBLOCK_XML2_ID"], $arXMLProp)
                    && 
array_key_exists($arXMLProp[$this->mess["IBLOCK_XML2_ID"]], $arUserFields)
                )
                {
                    
$arUserField $arUserFields[$arXMLProp[$this->mess["IBLOCK_XML2_ID"]]];
                    unset(
$arXMLProp[$this->mess["IBLOCK_XML2_ID"]]);

                    
$arProp = array();
                    
$i 0;
                    foreach(
$arXMLProp as $value)
                    {
                        if(
$arUserField["USER_TYPE"]["BASE_TYPE"] === "file")
                            
$arProp["n".($i++)] = $this->MakeFileArray($value);
                        elseif(
$arUserField["USER_TYPE"]["BASE_TYPE"] === "enum")
                            
$arProp["n".($i++)] = $this->GetSectionEnumByXML_ID($arUserField["ID"], $value);
                        else
                            
$arProp["n".($i++)] = $value;
                    }

                    if(
$arUserField["MULTIPLE"] == "N")
                        
$arSection[$arUserField["FIELD_NAME"]] = array_pop($arProp);
                    else
                        
$arSection[$arUserField["FIELD_NAME"]] = $arProp;
                }
            }
        }

        
$obSection = new CIBlockSection;
        
$rsSection $obSection->GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID"XML_ID"=>$arSection["XML_ID"]), false);
        if(
$arDBSection $rsSection->Fetch())
        {
            if(
                !
array_key_exists("CODE"$arSection)
                && 
is_array($this->translit_on_update)
            )
            {
                
$CODE CUtil::translit($arSection["NAME"], LANGUAGE_ID$this->translit_on_update);
                
$CODE $this->CheckSectionCode($IBLOCK_ID$arDBSection["ID"], $CODE);
                if (
$CODE !== false)
                    
$arSection["CODE"] = $CODE;
            }

            
$bChanged false;
            foreach(
$arSection as $key=>$value)
            {
                if(
is_array($arDBSection[$key]) || ($arDBSection[$key] != $value))
                {
                    
$bChanged true;
                    break;
                }
            }

            if(
$bChanged)
            {
                foreach(
$arUserFields as $arField1)
                {
                    if(
$arField1["USER_TYPE"]["BASE_TYPE"] == "file")
                    {
                        
$sectionUF $USER_FIELD_MANAGER->GetUserFields("IBLOCK_".$IBLOCK_ID."_SECTION"$arDBSection["ID"]);
                        foreach(
$sectionUF as $arField2)
                        {
                            if(
                                
$arField2["USER_TYPE"]["BASE_TYPE"] == "file"
                                
&& isset($arSection[$arField2["FIELD_NAME"]])
                            )
                            {
                                if(
$arField2["MULTIPLE"] == "Y" && is_array($arField2["VALUE"]))
                                {
                                    foreach(
$arField2["VALUE"] as $old_file_id)
                                        
$arSection[$arField2["FIELD_NAME"]][] = array("del"=>true,"old_id"=>$old_file_id);
                                }
                                elseif(
$arField2["MULTIPLE"] == "N" && $arField2["VALUE"] > 0)
                                {
                                    
$arSection[$arField2["FIELD_NAME"]]["old_id"] = $arField2["VALUE"];
                                }
                            }
                        }
                        break;
                    }
                }

                
$res $obSection->Update($arDBSection["ID"], $arSection);
                if(!
$res)
                {
                    
$this->LAST_ERROR $obSection->LAST_ERROR;
                    return 
$this->LAST_ERROR;
                }
            }
            else
            {
                
$DB->Query("UPDATE b_iblock_section SET TIMESTAMP_X = ".$DB->CurrentTimeFunction()." WHERE ID=".$arDBSection["ID"]);
            }

            
$arSection["ID"] = $arDBSection["ID"];
        }
        else
        {
            if(!
array_key_exists("CODE"$arSection) && is_array($this->translit_on_add))
            {
                
$CODE CUtil::translit($arSection["NAME"], LANGUAGE_ID$this->translit_on_add);
                
$CODE $this->CheckSectionCode($IBLOCK_ID0$CODE);
                if (
$CODE !== false)
                    
$arSection["CODE"] = $CODE;
            }

            
$arSection["IBLOCK_ID"] = $IBLOCK_ID;
            if(!isset(
$arSection["SORT"]))
                
$arSection["SORT"] = $this->next_step["section_sort"];

            
$arSection["ID"] = $obSection->Add($arSection);
            if(!
$arSection["ID"])
            {
                
$this->LAST_ERROR $obSection->LAST_ERROR;
                return 
$this->LAST_ERROR;
            }
        }

        if(
$XML_SECTION_PROPERTIES)
        {
            
$this->ImportSectionProperties($XML_SECTION_PROPERTIES$IBLOCK_ID$arSection["ID"]);
        }

        
//Clear seo cache
        
if(isset($bChanged) && $bChanged)
        {
            
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($this->next_step["IBLOCK_ID"], $arSection["ID"]);
            
$ipropValues->clearValues();
        }

        if(
$arSection["ID"])
        {
            
$this->_xml_file->Add(array("PARENT_ID" => 0"LEFT_MARGIN" => $arSection["ID"]));
        }

        if(
$XML_SECTIONS_PARENT)
        {
            
$rs $this->_xml_file->GetList(
                array(
"ID" => "asc"),
                array(
"PARENT_ID" => $XML_SECTIONS_PARENT),
                array(
"ID")
            );
            while(
$ar $rs->Fetch())
            {
                
$result $this->ImportSection($ar["ID"], $IBLOCK_ID$arSection["ID"]);
                if(
$result !== true)
                    return 
$result;
            }
        }

        return 
true;
    }

Блог разработчика

9 Августа 2016 ResizeImageGet и простой водяной знак налету

Сегодня поговорим о том как проще всего воткнуть водяной знак на картинки в Битрикс. Например, на все изображения каталога.

21 Июля 2016 Добавление вкладки в CRM коробки Битрикс24

В этом посте я покажу, как легко и просто добавить вкладку в сущность CRM. И не просто добавить, а вывести там свой контент.

21 Июля 2016 Как просто обращаться из коробки Битрикс24 на сайт на базе Битрикс

К примеру вам хочется внутренним скриптом дернуть с сайта-магазина информацию, которая там, в свою очередь, закрыта некоторыми правами. Например, админскими. Можно конечно мутить свой REST, или иной формат общения, но проще всего воспользоваться штатным инструментом:

Текст сообщения*
Загрузить изображение