Добавление произвольного типа свойства в Битрикс
/bitrix/php_interface/init.php
AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockNewProperty", "GetUserTypeDescription"));
class CIBlockNewProperty
{
public function GetUserTypeDescription()
{
return array(
"PROPERTY_TYPE" => "S", #-----один из стандартных типов
"USER_TYPE" => "MYIDCODE", #-----идентификатор типа свойства
"DESCRIPTION" => "Название свойства",
"GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"),
);
}
/*--------- вывод поля свойства на странице редактирования ---------*/
public function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
return '<input type="text" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'"> <input type="text" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.$value['DESCRIPTION'].'">';
}
}
public function GetUserTypeDescription()
{
return array(
"PROPERTY_TYPE" => "S", #-----один из стандартных типов
"USER_TYPE" => "MYIDCODE", #-----идентификатор типа свойства
"DESCRIPTION" => "Название свойства",
"GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"),
"ConvertToDB" => array(__CLASS__, "ConvertToDB"), #-----функция конвертирования данных перед сохранением в базу данных
"ConvertFromDB" => array(__CLASS__, "ConvertFromDB"), #-----функция конвертации после извлечения значения из базы данных и перед показом в форме редактирования элемента инфоблока
);
}
Как логично вытекает эти функции надо добавить в наш класс. Если брать пример с календарем, то можно так:
public static function ConvertToDB($arProperty, $arValue)
{
if (strlen($arValue['VALUE'])) {
$time = new \Bitrix\Main\Type\DateTime($arValue['VALUE']);
$arValue['VALUE'] = $time->getTimestamp();
}
return $arValue;
}
public static function ConvertFromDB($arProperty, $arValue)
{
if ($arValue['VALUE'] && defined('ADMIN_SECTION') && ADMIN_SECTION===true) {//мы так же проверяем, чтобы форматировалось только в админке
$time = Bitrix\Main\Type\DateTime::createFromTimestamp($arValue['VALUE']);
$arValue['VALUE'] = $time;
}
return $arValue;
}
И последнее, это вывод поля с календарем на странице редактирования. Берем стандартный Битриксовский:
public function GetPropertyHtml($arProperty, $value, $strHTMLControlName)
{
$ret = '<div class="adm-input-wrap adm-input-wrap-calendar"><input class="adm-input adm-input-calendar" type="text" name="'.$strHTMLControlName["VALUE"].'" size="23" value="'.$value['VALUE'].'">';
$ret .= '<span class="adm-calendar-icon" title="Нажмите для выбора даты" onclick="BX.calendar({node:this, field:\''.$strHTMLControlName["VALUE"].'\', form: \'\', bTime: true, bHideTime: false});"></span>';
$ret .= '</div>';
return $ret;
}