• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/cml2.php
  • Класс: CIBlockCMLImport
  • Вызов: CIBlockCMLImport::ImportPropertyDirectory
function ImportPropertyDirectory($arProperty, $arEnumXmlNodes)
{
	if (!Loader::includeModule('highloadblock'))
		return true;

	$rsProperty = CIBlockProperty::GetList(array(), array("ID"=>$arProperty["ID"]));
	$arProperty = $rsProperty->Fetch();
	if (!$arProperty)
		return true;

	$tableName = 'b_'.strtolower($arProperty["CODE"]);
	if ($arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"] == '')
	{
		$hlblock = BitrixHighloadblockHighloadBlockTable::getList(array(
			"filter" => array(
				"=TABLE_NAME" => $tableName,
			)))->fetch();
		if (!$hlblock)
		{
			$highBlockName = trim($arProperty["CODE"]);
			$highBlockName = preg_replace("/([^A-Za-z0-9]+)/", "", $highBlockName);
			if ($highBlockName == "")
				return GetMessage("IBLOCK_XML2_HBLOCK_NAME_IS_INVALID");

			$highBlockName = strtoupper(substr($highBlockName, 0, 1)).substr($highBlockName, 1);
			$data = array(
				'NAME' => $highBlockName,
				'TABLE_NAME' => $tableName,
			);
			$result = BitrixHighloadblockHighloadBlockTable::add($data);
			$highBlockID = $result->getId();

			$arFieldsName = array(
				'UF_NAME' => array("Y", "string"),
				'UF_XML_ID' => array("Y", "string"),
				'UF_LINK' => array("N", "string"),
				'UF_DESCRIPTION' => array("N", "string"),
				'UF_FULL_DESCRIPTION' => array("N", "string"),
				'UF_SORT' => array("N", "integer"),
				'UF_FILE' => array("N", "file"),
				'UF_DEF' => array("N", "boolean"),
			);
			$obUserField = new CUserTypeEntity();
			$sort = 100;
			foreach($arFieldsName as $fieldName => $fieldValue)
			{
				$arUserField = array(
					"ENTITY_ID" => "HLBLOCK_".$highBlockID,
					"FIELD_NAME" => $fieldName,
					"USER_TYPE_ID" => $fieldValue[1],
					"XML_ID" => "",
					"SORT" => $sort,
					"MULTIPLE" => "N",
					"MANDATORY" => $fieldValue[0],
					"SHOW_FILTER" => "N",
					"SHOW_IN_LIST" => "Y",
					"EDIT_IN_LIST" => "Y",
					"IS_SEARCHABLE" => "N",
					"SETTINGS" => array(),
				);
				$obUserField->Add($arUserField);
				$sort += 100;
			}
		}

		$arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"] = $tableName;
		$obProperty = new CIBlockProperty;
		$obProperty->Update($arProperty["ID"], $arProperty);
	}

	$hlblock = BitrixHighloadblockHighloadBlockTable::getList(array(
		"filter" => array(
			"=TABLE_NAME" => $arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"],
		)))->fetch();

	if (empty($hlblock))
	{
		return GetMessage(
			"IBLOCK_XML2_HBLOCK_ABSENT",
			array(
				"#ID#" => $arProperty["ID"],
				"#NAME#" => $arProperty["NAME"]
			)
		);
	}

	$entity = BitrixHighloadblockHighloadBlockTable::compileEntity($hlblock);
	$entity_data_class = $entity->getDataClass();

	$arEnumMap = array();
	$rsData = $entity_data_class::getList(array(
		"select" => array("ID", "UF_NAME", "UF_XML_ID", "UF_SORT"),
	));
	while($arData = $rsData->fetch())
	{
		$arEnumMap[$arData["UF_XML_ID"]] = $arData;
	}

	$i = 0;
	foreach($arEnumXmlNodes as $arE)
	{
		if(
			$arE["NAME"] == $this->mess["IBLOCK_XML2_TYPE_LIST"]
		)
		{
			$arE = $this->_xml_file->GetAllChildrenArray($arE);
			if(
				isset($arE[$this->mess["IBLOCK_XML2_VALUE_ID"]])
				&& isset($arE[$this->mess["IBLOCK_XML2_VALUE"]])
			)
			{
				$xml_id = $arE[$this->mess["IBLOCK_XML2_VALUE_ID"]];
				$arFields = array(
					"UF_XML_ID" => $xml_id,
					"UF_NAME" => $arE[$this->mess["IBLOCK_XML2_VALUE"]],
				);
				if (isset($arE[$this->mess["IBLOCK_XML2_PICTURE"]]))
				{
					$arFields["UF_FILE"] = $this->MakeFileArray($arE[$this->mess["IBLOCK_XML2_PICTURE"]]);
				}

				if(!array_key_exists($xml_id, $arEnumMap))
				{
					$entity_data_class::add($arFields);
				}
				elseif ($arEnumMap[$xml_id]["UF_NAME"] !== $arFields['UF_NAME'])
				{
					$entity_data_class::update($arEnumMap[$xml_id]["ID"], $arFields);
				}
			}
		}
	}

	return true;
}