function ImportProperties($XML_PROPERTIES_PARENT, $IBLOCK_ID) { $obProperty = new CIBlockProperty; $sort = 100; $arElementFields = array( "CML2_ACTIVE" => GetMessage("IBLOCK_XML2_BX_ACTIVE"), "CML2_CODE" => GetMessage("IBLOCK_XML2_SYMBOL_CODE"), "CML2_SORT" => GetMessage("IBLOCK_XML2_SORT"), "CML2_ACTIVE_FROM" => GetMessage("IBLOCK_XML2_START_TIME"), "CML2_ACTIVE_TO" => GetMessage("IBLOCK_XML2_END_TIME"), "CML2_PREVIEW_TEXT" => GetMessage("IBLOCK_XML2_ANONS"), "CML2_DETAIL_TEXT" => GetMessage("IBLOCK_XML2_DETAIL"), "CML2_PREVIEW_PICTURE" => GetMessage("IBLOCK_XML2_PREVIEW_PICTURE"), ); $rs = $this->_xml_file->GetList( array("ID" => "asc"), array("PARENT_ID" => $XML_PROPERTIES_PARENT), array("ID") ); while($ar = $rs->Fetch()) { $XML_ENUM_PARENT = false; $arProperty = array( ); $rsP = $this->_xml_file->GetList( array("ID" => "asc"), array("PARENT_ID" => $ar["ID"]) ); while($arP = $rsP->Fetch()) { if(isset($arP["VALUE_CLOB"])) $arP["VALUE"] = $arP["VALUE_CLOB"]; if($arP["NAME"]==GetMessage("IBLOCK_XML2_ID")) { $arProperty["XML_ID"] = $arP["VALUE"]; if(array_key_exists($arProperty["XML_ID"], $arElementFields)) break; } elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_NAME")) $arProperty["NAME"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_MULTIPLE")) $arProperty["MULTIPLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_SORT")) $arProperty["SORT"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_CODE")) $arProperty["CODE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_DEFAULT_VALUE")) $arProperty["DEFAULT_VALUE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_SERIALIZED")) $arProperty["SERIALIZED"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_PROPERTY_TYPE")) $arProperty["PROPERTY_TYPE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_ROWS")) $arProperty["ROW_COUNT"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_COLUMNS")) $arProperty["COL_COUNT"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_LIST_TYPE")) $arProperty["LIST_TYPE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_FILE_EXT")) $arProperty["FILE_TYPE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_FIELDS_COUNT")) $arProperty["MULTIPLE_CNT"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_USER_TYPE")) $arProperty["USER_TYPE"] = $arP["VALUE"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_WITH_DESCRIPTION")) $arProperty["WITH_DESCRIPTION"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_SEARCH")) $arProperty["SEARCHABLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_FILTER")) $arProperty["FILTRABLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_LINKED_IBLOCK")) $arProperty["LINK_IBLOCK_ID"] = $this->GetIBlockByXML_ID($arP["VALUE"]); elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_CHOICE_VALUES")) $XML_ENUM_PARENT = $arP["ID"]; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_BX_IS_REQUIRED")) $arProperty["IS_REQUIRED"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N"; elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_VALUES_TYPE")) { if($arP["VALUE"] == GetMessage("IBLOCK_XML2_TYPE_LIST")) $arProperty["PROPERTY_TYPE"] = "L"; elseif($arP["VALUE"] == GetMessage("IBLOCK_XML2_TYPE_NUMBER")) $arProperty["PROPERTY_TYPE"] = "N"; } elseif($arP["NAME"]==GetMessage("IBLOCK_XML2_VALUES_TYPES")) { //This property metadata contains information about it's type $rsTypes = $this->_xml_file->GetList( array("ID" => "asc"), array("PARENT_ID" => $arP["ID"]), array("ID", "LEFT_MARGIN", "RIGHT_MARGIN", "NAME") ); $arType = $rsTypes->Fetch(); //We'll process only properties with NOT composing types //composed types will be supported only as simple string properties if($arType && !$rsTypes->Fetch()) { $rsType = $this->_xml_file->GetList( array("ID" => "asc"), array("PARENT_ID" => $arType["ID"]), array("ID", "LEFT_MARGIN", "RIGHT_MARGIN", "NAME", "VALUE") ); while($arType = $rsType->Fetch()) { if($arType["NAME"] == GetMessage("IBLOCK_XML2_TYPE")) { if($arType["VALUE"] == GetMessage("IBLOCK_XML2_TYPE_LIST")) $arProperty["PROPERTY_TYPE"] = "L"; elseif($arType["VALUE"] == GetMessage("IBLOCK_XML2_TYPE_NUMBER")) $arProperty["PROPERTY_TYPE"] = "N"; } elseif($arType["NAME"] == GetMessage("IBLOCK_XML2_CHOICE_VALUES")) { $XML_ENUM_PARENT = $arType["ID"]; } } } } } if(array_key_exists($arProperty["XML_ID"], $arElementFields)) continue; // Skip properties with no choice values // http://jabber.bx/view.php?id=30476 $arEnumXmlNodes = array(); if($XML_ENUM_PARENT) { $rsE = $this->_xml_file->GetList( array("ID" => "asc"), array("PARENT_ID" => $XML_ENUM_PARENT) ); while($arE = $rsE->Fetch()) { if(isset($arE["VALUE_CLOB"])) $arE["VALUE"] = $arE["VALUE_CLOB"]; $arEnumXmlNodes[] = $arE; } if (empty($arEnumXmlNodes)) continue; } if($arProperty["SERIALIZED"] == "Y") $arProperty["DEFAULT_VALUE"] = unserialize($arProperty["DEFAULT_VALUE"]); $rsProperty = $obProperty->GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID, "XML_ID"=>$arProperty["XML_ID"])); if($arDBProperty = $rsProperty->Fetch()) { $bChanged = false; foreach($arProperty as $key=>$value) { if($arDBProperty[$key] !== $value) { $bChanged = true; break; } } if(!$bChanged) $arProperty["ID"] = $arDBProperty["ID"]; elseif($obProperty->Update($arDBProperty["ID"], $arProperty)) $arProperty["ID"] = $arDBProperty["ID"]; else return $obProperty->LAST_ERROR; } else { $arProperty["IBLOCK_ID"] = $IBLOCK_ID; $arProperty["ACTIVE"] = "Y"; if(!array_key_exists("PROPERTY_TYPE", $arProperty)) $arProperty["PROPERTY_TYPE"] = "S"; if(!array_key_exists("SORT", $arProperty)) $arProperty["SORT"] = $sort; if(!array_key_exists("CODE", $arProperty)) { $arProperty["CODE"] = CUtil::translit($arProperty["NAME"], LANGUAGE_ID, array( "max_len" => 50, "change_case" => 'U', // 'L' - toLower, 'U' - toUpper, false - do not change "replace_space" => '_', "replace_other" => '_', "delete_repeat_replace" => true, )); if(preg_match('/^[0-9]/', $arProperty["CODE"])) $arProperty["CODE"] = '_'.$arProperty["CODE"]; } $arProperty["ID"] = $obProperty->Add($arProperty); if(!$arProperty["ID"]) return $obProperty->LAST_ERROR; } if($XML_ENUM_PARENT) { $arEnumMap = array(); $arProperty["VALUES"] = array(); $rsEnum = CIBlockProperty::GetPropertyEnum($arProperty["ID"]); while($arEnum = $rsEnum->Fetch()) { $arProperty["VALUES"][$arEnum["ID"]] = $arEnum; $arEnumMap[$arEnum["XML_ID"]] = &$arProperty["VALUES"][$arEnum["ID"]]; } foreach($arEnumXmlNodes as $i => $arE) { if( $arE["NAME"] == GetMessage("IBLOCK_XML2_CHOICE") || $arE["NAME"] == GetMessage("IBLOCK_XML2_CHOICE_VALUE") ) { $arE = $this->_xml_file->GetAllChildrenArray($arE); if(isset($arE[GetMessage("IBLOCK_XML2_ID")])) { $xml_id = $arE[GetMessage("IBLOCK_XML2_ID")]; if(!array_key_exists($xml_id, $arEnumMap)) { $arProperty["VALUES"]["n".$i] = array(); $arEnumMap[$xml_id] = &$arProperty["VALUES"]["n".$i]; $i++; } $arEnumMap[$xml_id]["CML2_EXPORT_FLAG"] = true; $arEnumMap[$xml_id]["XML_ID"] = $xml_id; if(isset($arE[GetMessage("IBLOCK_XML2_VALUE")])) $arEnumMap[$xml_id]["VALUE"] = $arE[GetMessage("IBLOCK_XML2_VALUE")]; if(isset($arE[GetMessage("IBLOCK_XML2_BY_DEFAULT")])) $arEnumMap[$xml_id]["DEF"] = ($arE[GetMessage("IBLOCK_XML2_BY_DEFAULT")]=="true") || intval($arE[GetMessage("IBLOCK_XML2_BY_DEFAULT")])? "Y": "N"; if(isset($arE[GetMessage("IBLOCK_XML2_SORT")])) $arEnumMap[$xml_id]["SORT"] = intval($arE[GetMessage("IBLOCK_XML2_SORT")]); } } elseif( $arE["NAME"] == GetMessage("IBLOCK_XML2_TYPE_LIST") ) { $arE = $this->_xml_file->GetAllChildrenArray($arE); if(isset($arE[GetMessage("IBLOCK_XML2_VALUE_ID")])) { $xml_id = $arE[GetMessage("IBLOCK_XML2_VALUE_ID")]; if(!array_key_exists($xml_id, $arEnumMap)) { $arProperty["VALUES"]["n".$i] = array(); $arEnumMap[$xml_id] = &$arProperty["VALUES"]["n".$i]; $i++; } $arEnumMap[$xml_id]["CML2_EXPORT_FLAG"] = true; $arEnumMap[$xml_id]["XML_ID"] = $xml_id; if(isset($arE[GetMessage("IBLOCK_XML2_VALUE")])) $arEnumMap[$xml_id]["VALUE"] = $arE[GetMessage("IBLOCK_XML2_VALUE")]; } } } $bUpdateOnly = array_key_exists("bUpdateOnly", $this->next_step) && $this->next_step["bUpdateOnly"]; $sort = 100; foreach($arProperty["VALUES"] as $id=>$arEnum) { if(!isset($arEnum["CML2_EXPORT_FLAG"])) { //Delete value only when full exchange happened if(!$bUpdateOnly) $arProperty["VALUES"][$id]["VALUE"] = ""; } elseif(isset($arEnum["SORT"])) { if($arEnum["SORT"] > $sort) $sort = $arEnum["SORT"] + 100; } else { $arProperty["VALUES"][$id]["SORT"] = $sort; $sort += 100; } } $obProperty->UpdateEnum($arProperty["ID"], $arProperty["VALUES"], false); } $sort += 100; } return true; }
function ImportPropertyEnum($arProperty, $arEnumXmlNodes) { $arEnumMap = array(); $arProperty["VALUES"] = array(); $rsEnum = CIBlockProperty::GetPropertyEnum($arProperty["ID"]); while ($arEnum = $rsEnum->Fetch()) { $arProperty["VALUES"][$arEnum["ID"]] = $arEnum; $arEnumMap[$arEnum["XML_ID"]] =& $arProperty["VALUES"][$arEnum["ID"]]; } $i = 0; foreach ($arEnumXmlNodes as $arE) { if ($arE["NAME"] == $this->mess["IBLOCK_XML2_CHOICE"] || $arE["NAME"] == $this->mess["IBLOCK_XML2_CHOICE_VALUE"]) { $arE = $this->_xml_file->GetAllChildrenArray($arE); if (isset($arE[$this->mess["IBLOCK_XML2_ID"]])) { $xml_id = $arE[$this->mess["IBLOCK_XML2_ID"]]; if (!array_key_exists($xml_id, $arEnumMap)) { $arProperty["VALUES"]["n" . $i] = array(); $arEnumMap[$xml_id] =& $arProperty["VALUES"]["n" . $i]; $i++; } $arEnumMap[$xml_id]["CML2_EXPORT_FLAG"] = true; $arEnumMap[$xml_id]["XML_ID"] = $xml_id; if (isset($arE[$this->mess["IBLOCK_XML2_VALUE"]])) { $arEnumMap[$xml_id]["VALUE"] = $arE[$this->mess["IBLOCK_XML2_VALUE"]]; } if (isset($arE[$this->mess["IBLOCK_XML2_BY_DEFAULT"]])) { $arEnumMap[$xml_id]["DEF"] = $arE[$this->mess["IBLOCK_XML2_BY_DEFAULT"]] == "true" || intval($arE[$this->mess["IBLOCK_XML2_BY_DEFAULT"]]) ? "Y" : "N"; } if (isset($arE[$this->mess["IBLOCK_XML2_SORT"]])) { $arEnumMap[$xml_id]["SORT"] = intval($arE[$this->mess["IBLOCK_XML2_SORT"]]); } } } elseif ($arE["NAME"] == $this->mess["IBLOCK_XML2_TYPE_LIST"]) { $arE = $this->_xml_file->GetAllChildrenArray($arE); if (isset($arE[$this->mess["IBLOCK_XML2_VALUE_ID"]])) { $xml_id = $arE[$this->mess["IBLOCK_XML2_VALUE_ID"]]; if (!array_key_exists($xml_id, $arEnumMap)) { $arProperty["VALUES"]["n" . $i] = array(); $arEnumMap[$xml_id] =& $arProperty["VALUES"]["n" . $i]; $i++; } $arEnumMap[$xml_id]["CML2_EXPORT_FLAG"] = true; $arEnumMap[$xml_id]["XML_ID"] = $xml_id; if (isset($arE[$this->mess["IBLOCK_XML2_VALUE"]])) { $arEnumMap[$xml_id]["VALUE"] = $arE[$this->mess["IBLOCK_XML2_VALUE"]]; } } } } $bUpdateOnly = array_key_exists("bUpdateOnly", $this->next_step) && $this->next_step["bUpdateOnly"]; $sort = 100; foreach ($arProperty["VALUES"] as $id => $arEnum) { if (!isset($arEnum["CML2_EXPORT_FLAG"])) { //Delete value only when full exchange happened if (!$bUpdateOnly) { $arProperty["VALUES"][$id]["VALUE"] = ""; } } elseif (isset($arEnum["SORT"])) { if ($arEnum["SORT"] > $sort) { $sort = $arEnum["SORT"] + 100; } } else { $arProperty["VALUES"][$id]["SORT"] = $sort; $sort += 100; } } $obProperty = new CIBlockProperty(); $obProperty->UpdateEnum($arProperty["ID"], $arProperty["VALUES"], false); return true; }
public static function syncSectionToListProp($iblock_id, $prop_id) { if (intval($iblock_id) && intval($prop_id) > 0) { \CModule::IncludeModule('iblock'); $arSectionVariants = array(); $dbResult = \CIBlockSection::GetList(array(), array(''), false, array('ID', 'CODE', 'NAME', 'SORT')); while ($next = $dbResult->GetNext()) { if (!empty($next['NAME']) && !empty($next['CODE'])) { $next['VALUE'] = $next['NAME']; $next['XML_ID'] = 'xml_section_' . $next['CODE']; unset($next['VALUE']); unset($next['CODE']); $arSectionVariants[] = $next; } } $obProperty = new \CIBlockProperty(); return $obProperty->UpdateEnum($prop_id, $arSectionVariants); } return false; }