Создаём в Bitrix пользовательский тип свойства "привязка к элементам с описание"
Иногда при разработке приходиться сталкиваться с задачей, когда у товара например есть "опции" цену которой необходимо указать в описании товара или "составные части" количество которых необходимо отразить. Как правило зависимости учитываются при помощи свойства "Привязка к элементам" и в таких случаях хорошо использовать описание для значения свойства, как у строковых свойств.
Решить задачу можно созданием пользовательского типа свойств - Привязка к элементам с описанием.
Для этого создадим файл в папке /bitrix/php_interface/ ( или /local/php_interface/) elementwithdescription.php
class ElementWithDescription
{
function GetIBlockPropertyDescription()
{
return array(
"PROPERTY_TYPE" => "E", // Прототип типа свойства - привязка к элементам
"USER_TYPE" => "ElementWithDescription",
"DESCRIPTION" => "Привязка к элементам с описанием", //Название нового типа свойства
'GetPropertyFieldHtml' => array(__CLASS__, 'GetPropertyFieldHtml'),
"ConvertToDB" => array(__CLASS__,"ConvertToDB"),
"ConvertFromDB" => array(__CLASS__,"ConvertFromDB"),
);
}
function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
$value["DESCRIPTION"] = unserialize($value["DESCRIPTION"]);
$arItem = Array(
"ID" => 0,
"IBLOCK_ID" => 0,
"NAME" => ""
);
if(intval($value["VALUE"]) > 0)
{
$arFilter = Array(
"ID" => intval($value["VALUE"]),
"IBLOCK_ID" => $arProperty["LINK_IBLOCK_ID"],
);
$arItem = \CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "IBLOCK_ID", "NAME"))->Fetch();
}
$html = '<input name="'.$strHTMLControlName["VALUE"].'" id="'.$strHTMLControlName["VALUE"].'" value="'.htmlspecialcharsex($value["VALUE"]).'" size="5" type="text">';
$html .= ' <span id="sp_'.md5($strHTMLControlName["VALUE"]).'_'.$key.'">'.$arItem["NAME"].'</span>';
$html .= '<input type="button" value="Выбрать" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?lang='.LANG.'&IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].'&n='.$strHTMLControlName["VALUE"].'\', 600, 500);">';
$html .= ' Количество:<input type="text" id="quan" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.htmlspecialcharsex($value["DESCRIPTION"]).'">';
return $html;
}
function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName)
{
return;
}
function ConvertToDB($arProperty, $value)
{
$return = false;
if( is_array($value) && array_key_exists("VALUE", $value) && ($value['VALUE'] > 0))
{
$return = array(
"VALUE" => serialize($value["VALUE"]),
"DESCRIPTION" => serialize($value["DESCRIPTION"]),
);
}
return $return;
}
function ConvertFromDB($arProperty, $value)
{
$return = false;
if(!is_array($value["VALUE"]))
{
$return = array(
"VALUE" => unserialize($value["VALUE"]),
);
}
if(!is_array($value["DESCRIPTION"]))
{
$return["DESCRIPTION"] = unserialize($value["DESCRIPTION"]);
}
if ($return['VALUE'] > 0):
return $return;
endif;
}
}
Подключим созданный нами класс в файле /bitrix/php_interface/init.php ( или /local/php_interface/init.php) для этого добавим следующие строки:
include_once(__DIR__.'/elementwithdescription.php');
// Добавим обработчик события и добавим наш пользовательский класс
AddEventHandler('iblock', 'OnIBlockPropertyBuildList', ['ElementWithDescription', 'GetIBlockPropertyDescription']);
Теперь при выборе типов свойств при создании свойства нам доступен созданный нами новый тип свойства: