• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
  • Класс: CIBlockDocument
  • Вызов: CIBlockDocument::AddDocumentField
static function AddDocumentField($documentType, $arFields)
{
	$iblockId = intval(mb_substr($documentType, mb_strlen("iblock_")));
	if ($iblockId <= 0)
		throw new CBPArgumentOutOfRangeException("documentType", $documentType);

	if (mb_substr($arFields["code"], 0, mb_strlen("PROPERTY_")) == "PROPERTY_")
		$arFields["code"] = mb_substr($arFields["code"], mb_strlen("PROPERTY_"));

	$arFieldsTmp = array(
		"NAME" => $arFields["name"],
		"ACTIVE" => "Y",
		"SORT" => 150,
		"CODE" => $arFields["code"],
		'MULTIPLE' => $arFields['multiple'] == 'Y' || (string)$arFields['multiple'] === '1' ? 'Y' : 'N',
		'IS_REQUIRED' => $arFields['required'] == 'Y' || (string)$arFields['required'] === '1' ? 'Y' : 'N',
		"IBLOCK_ID" => $iblockId,
		"FILTRABLE" => "Y",
	);

	if (mb_strpos("0123456789", mb_substr($arFieldsTmp["CODE"], 0, 1)) !== false)
		$arFieldsTmp["CODE"] = self::generateMnemonicCode($arFieldsTmp["CODE"]);

	if (array_key_exists("additional_type_info", $arFields))
		$arFieldsTmp["LINK_IBLOCK_ID"] = intval($arFields["additional_type_info"]);

	if (mb_strstr($arFields["type"], ":") !== false)
	{
		if($arFields["type"] == "S:DiskFile")
		{
			$arFieldsTmp["TYPE"] = $arFields["type"];
		}
		else
		{
			list($arFieldsTmp["PROPERTY_TYPE"], $arFieldsTmp["USER_TYPE"]) = explode(":", $arFields["type"], 2);
			if ($arFields["type"] == "E:EList")
				$arFieldsTmp["LINK_IBLOCK_ID"] = $arFields["options"];
		}
	}
	elseif ($arFields["type"] == "user")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "S";
		$arFieldsTmp["USER_TYPE"]= "UserID";
	}
	elseif ($arFields["type"] == "date")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "S";
		$arFieldsTmp["USER_TYPE"]= "Date";
	}
	elseif ($arFields["type"] == "datetime")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "S";
		$arFieldsTmp["USER_TYPE"]= "DateTime";
	}
	elseif ($arFields["type"] == "file")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "F";
		$arFieldsTmp["USER_TYPE"]= "";
	}
	elseif ($arFields["type"] == "select")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "L";
		$arFieldsTmp["USER_TYPE"]= false;

		if (is_array($arFields["options"]))
		{
			$i = 10;
			foreach ($arFields["options"] as $k => $v)
			{
				$arFieldsTmp["VALUES"][] = array("XML_ID" => $k, "VALUE" => $v, "DEF" => "N", "SORT" => $i);
				$i = $i + 10;
			}
		}
		elseif (is_string($arFields["options"]) && ($arFields["options"] <> ''))
		{
			$a = explode("n", $arFields["options"]);
			$i = 10;
			foreach ($a as $v)
			{
				$v = trim(trim($v), "rn");
				if (!$v)
					continue;
				$v1 = $v2 = $v;
				if (mb_substr($v, 0, 1) == "[" && mb_strpos($v, "]") !== false)
				{
					$v1 = mb_substr($v, 1, mb_strpos($v, "]") - 1);
					$v2 = trim(mb_substr($v, mb_strpos($v, "]") + 1));
				}
				$arFieldsTmp["VALUES"][] = array("XML_ID" => $v1, "VALUE" => $v2, "DEF" => "N", "SORT" => $i);
				$i = $i + 10;
			}
		}
	}
	elseif($arFields["type"] == "bool")
	{
		$arFieldsTmp["TYPE"] = "L";
		$arFieldsTmp["VALUES"][] = array(
			"XML_ID" => 'Y',
			"VALUE" => GetMessage("BPVDX_YES"),
			"DEF" => "N",
			"SORT" => 10
		);
		$arFieldsTmp["VALUES"][] = array(
			"XML_ID" => 'N',
			"VALUE" => GetMessage("BPVDX_NO"),
			"DEF" => "N",
			"SORT" => 20
		);
	}
	else
	{
		$arFieldsTmp["PROPERTY_TYPE"] = $arFields["type"];
		$arFieldsTmp["USER_TYPE"] = false;
	}

	if ($arFieldsTmp["PROPERTY_TYPE"] == "T")
	{
		$arFieldsTmp["PROPERTY_TYPE"] = "S";
		$arFieldsTmp["ROW_COUNT"] = 5;
	}

	$properties = CIBlockProperty::getList(
		array(),
		array("IBLOCK_ID" => $arFieldsTmp["IBLOCK_ID"], "CODE" => $arFieldsTmp["CODE"])
	);
	if(!$properties->fetch())
	{
		$ibp = new CIBlockProperty;
		$propId = $ibp->Add($arFieldsTmp);
		if (intval($propId) <= 0)
			throw new Exception($ibp->LAST_ERROR);
	}

	return "PROPERTY_".$arFields["code"];
}