Редактировать

Добавление свойства в инфоблок

Задача

Добавить в инфоблок новое свойство, предварительно проверив на существование.

Решение

Типы свойств

S - строка, 
N - число, 
F - файл, 
L - список, 
E - привязка к элементам, 
G - привязка к группам.

Для пользовательских типов свойств нужно указывать еще и USER_TYPE.

Привязка к элементам в виде списка:
PROPERTY_TYPE => 'E'
USER_TYPE => 'EList'

Дата/Время:
PROPERTY_TYPE => 'S'
USER_TYPE => 'DateTime'

Привязка к элементам по XML_ID:
PROPERTY_TYPE => 'S'
USER_TYPE => 'ElementXmlID'

Привязка к файлу на сервере:
PROPERTY_TYPE => 'S'
USER_TYPE => 'FileMan'

HTML/текст:
PROPERTY_TYPE => 'S'
USER_TYPE => 'HTML'

Привязка к элементам с автозаполнением:
PROPERTY_TYPE => 'E'
USER_TYPE => 'EAutocomplete'

Привязка к товарам SKU:
PROPERTY_TYPE => 'E'
USER_TYPE => 'SKU'

Счетчик:
PROPERTY_TYPE => 'N'
USER_TYPE => 'Sequence'

Привязка к картам Google Maps:
PROPERTY_TYPE => 'S'
USER_TYPE => 'map_google'

Привязка к Яндекс.Карте:
PROPERTY_TYPE => 'S'
USER_TYPE => 'map_yandex'

Видео:
PROPERTY_TYPE => 'S'
USER_TYPE => 'video'

Привязка к теме форума:
PROPERTY_TYPE => 'S'
USER_TYPE => 'TopicID'

Привязка к пользователю:
PROPERTY_TYPE => 'S'
USER_TYPE => 'UserID'

Пример добавления

<?
// константа должна быть в файле констант, не забываем все значимое хранить там
const IBID_CATALOG = 1;

// начальные данные
$propCode = 'ACTION_DATE_END';

// Попытка получить свойство по коду
$dbRes = CIBlockProperty::GetList(["ID"=>"ASC"], [
	"IBLOCK_ID"=>IBID_CATALOG, 
	"CODE" => $propCode
]);

$propExists = false;

if ($prop = $dbRes->GetNext()) {
    $propExists = true;
}

// Если свойства нет, то добавим его
if (!$propExists) {
	// Добавляется свойство типа "ДатаВремя"
	$arFields = Array(
        "NAME" => "Дата окончания акции",
        "ACTIVE" => "Y",
        "SORT" => "6000",
        "CODE" => $propCode,
        "PROPERTY_TYPE" => 'S',
        "USER_TYPE" => 'DateTime',
        "IBLOCK_ID" => IBID_CATALOG,
    );
	

	// Если нужно наполнить данными
    $arFields["VALUES"][0] = Array(
        "VALUE" => new \Bitrix\Main\Type\DateTime(),
        "DEF" => "N",
        "SORT" => "100"
    );

    $arFields["VALUES"][1] = Array(
        "VALUE" => \Bitrix\Main\Type\DateTime::createFromUserTime("16.08.2014 15:30:10"),
        "DEF" => "N",
        "SORT" => "200"
    );

    $arFields["VALUES"][2] = Array(
        "VALUE" => \Bitrix\Main\Type\DateTime::createFromTimestamp(strtotime("+5 days"));,
        "DEF" => "Y",
        "SORT" => "300"
    );

    $ibp = new CIBlockProperty();
    $propID = $ibp->Add($arFields);
}
?>