• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/cml2.php
  • Класс: CIBlockCMLImport
  • Вызов: CIBlockCMLImport::ImportProperties
function ImportProperties($XML_PROPERTIES_PARENT, $IBLOCK_ID)
{
	$obProperty = new CIBlockProperty;
	$sort = 100;

	$arElementFields = array(
		"CML2_ACTIVE" => $this->mess["IBLOCK_XML2_BX_ACTIVE"],
		"CML2_CODE" => $this->mess["IBLOCK_XML2_SYMBOL_CODE"],
		"CML2_SORT" => $this->mess["IBLOCK_XML2_SORT"],
		"CML2_ACTIVE_FROM" => $this->mess["IBLOCK_XML2_START_TIME"],
		"CML2_ACTIVE_TO" => $this->mess["IBLOCK_XML2_END_TIME"],
		"CML2_PREVIEW_TEXT" => $this->mess["IBLOCK_XML2_ANONS"],
		"CML2_DETAIL_TEXT" => $this->mess["IBLOCK_XML2_DETAIL"],
		"CML2_PREVIEW_PICTURE" => $this->mess["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;
		$isExternal = 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"]==$this->mess["IBLOCK_XML2_ID"])
			{
				$arProperty["XML_ID"] = $arP["VALUE"];
				if(array_key_exists($arProperty["XML_ID"], $arElementFields))
					break;
			}
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_NAME"])
				$arProperty["NAME"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_MULTIPLE"])
				$arProperty["MULTIPLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_SORT"])
				$arProperty["SORT"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_CODE"])
				$arProperty["CODE"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_DEFAULT_VALUE"])
				$arProperty["DEFAULT_VALUE"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_SERIALIZED"])
				$arProperty["SERIALIZED"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_PROPERTY_TYPE"])
			{
				$arProperty["PROPERTY_TYPE"] = $arP["VALUE"];
				$arProperty["USER_TYPE"] = "";
			}
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_ROWS"])
				$arProperty["ROW_COUNT"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_COLUMNS"])
				$arProperty["COL_COUNT"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_LIST_TYPE"])
				$arProperty["LIST_TYPE"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_FILE_EXT"])
				$arProperty["FILE_TYPE"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_FIELDS_COUNT"])
				$arProperty["MULTIPLE_CNT"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_USER_TYPE"])
				$arProperty["USER_TYPE"] = $arP["VALUE"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_WITH_DESCRIPTION"])
				$arProperty["WITH_DESCRIPTION"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_SEARCH"])
				$arProperty["SEARCHABLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_FILTER"])
				$arProperty["FILTRABLE"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_LINKED_IBLOCK"])
				$arProperty["LINK_IBLOCK_ID"] = $this->GetIBlockByXML_ID($arP["VALUE"]);
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_CHOICE_VALUES"])
				$XML_ENUM_PARENT = $arP["ID"];
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_IS_REQUIRED"])
				$arProperty["IS_REQUIRED"] = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? "Y": "N";
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_VALUES_TYPE"])
			{
				if(
					$arP["VALUE"] == $this->mess["IBLOCK_XML2_TYPE_LIST"]
					&& !$isExternal
				)
				{
					$arProperty["PROPERTY_TYPE"] = "L";
					$arProperty["USER_TYPE"] = "";
				}
				elseif($arP["VALUE"] == $this->mess["IBLOCK_XML2_TYPE_NUMBER"])
				{
					$arProperty["PROPERTY_TYPE"] = "N";
					$arProperty["USER_TYPE"] = "";
				}
				elseif($arP["VALUE"] == $this->mess["IBLOCK_XML2_TYPE_STRING"])
				{
					$arProperty["PROPERTY_TYPE"] = "S";
					$arProperty["USER_TYPE"] = "";
				}
				elseif($arP["VALUE"] == $this->mess["IBLOCK_XML2_USER_TYPE_DATE"])
				{
					$arProperty["PROPERTY_TYPE"] = "S";
					$arProperty["USER_TYPE"] = "Date";
				}
				elseif($arP["VALUE"] == $this->mess["IBLOCK_XML2_USER_TYPE_DATETIME"])
				{
					$arProperty["PROPERTY_TYPE"] = "S";
					$arProperty["USER_TYPE"] = "DateTime";
				}
			}
			elseif($arP["NAME"]==$this->mess["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"] == $this->mess["IBLOCK_XML2_TYPE"])
						{
							if($arType["VALUE"] == $this->mess["IBLOCK_XML2_TYPE_LIST"])
								$arProperty["PROPERTY_TYPE"] = "L";
							elseif($arType["VALUE"] == $this->mess["IBLOCK_XML2_TYPE_NUMBER"])
								$arProperty["PROPERTY_TYPE"] = "N";
						}
						elseif($arType["NAME"] == $this->mess["IBLOCK_XML2_CHOICE_VALUES"])
						{
							$XML_ENUM_PARENT = $arType["ID"];
						}
					}
				}
			}
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_USER_TYPE_SETTINGS"])
			{
				$arProperty["USER_TYPE_SETTINGS"] = unserialize($arP["VALUE"], ['allowed_classes' => false]);
			}
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_EXTERNAL"])
			{
				$isExternal = ($arP["VALUE"]=="true") || intval($arP["VALUE"])? true: false;
				if ($isExternal)
				{
					$arProperty["PROPERTY_TYPE"] = "S";
					$arProperty["USER_TYPE"] = "directory";
				}
			}
			elseif($arP["NAME"]==$this->mess["IBLOCK_XML2_BX_PROPERTY_FEATURE_LIST"])
			{
				$arProperty["FEATURES"] = unserialize($arP["VALUE"], ['allowed_classes' => false]);
			}
		}

		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 (isset($arProperty['SERIALIZED']))
		{
			if ($arProperty['SERIALIZED'] === 'Y')
			{
				$arProperty['DEFAULT_VALUE'] = unserialize($arProperty['DEFAULT_VALUE'], ['allowed_classes' => false]);
			}
			unset($arProperty['SERIALIZED']);
		}

		$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"] = $this->safeTranslit($arProperty["NAME"]);
				if(preg_match('/^[0-9]/', $arProperty["CODE"]))
					$arProperty["CODE"] = '_'.$arProperty["CODE"];

				$rsProperty = $obProperty->GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID, "CODE"=>$arProperty["CODE"]));
				if($arDBProperty = $rsProperty->Fetch())
				{
					$suffix = 0;
					do {
						$suffix++;
						$rsProperty = $obProperty->GetList(array(), array("IBLOCK_ID"=>$IBLOCK_ID, "CODE"=>$arProperty["CODE"]."_".$suffix));
					} while ($rsProperty->Fetch());
					$arProperty["CODE"] .= '_'.$suffix;
				}
			}
			$arProperty["ID"] = $obProperty->Add($arProperty);
			if(!$arProperty["ID"])
				return $obProperty->LAST_ERROR;
		}

		if($XML_ENUM_PARENT)
		{
			if ($isExternal)
				$result = $this->ImportPropertyDirectory($arProperty, $arEnumXmlNodes);
			else
				$result = $this->ImportPropertyEnum($arProperty, $arEnumXmlNodes);

			if ($result !== true)
				return $result;
		}
		$sort += 100;
	}
	return true;
}