Skip to content

Instantly share code, notes, and snippets.

@Isa3v
Last active October 24, 2023 18:29
Show Gist options
  • Save Isa3v/3723f5345d451a90c13cc1e09d6b134e to your computer and use it in GitHub Desktop.
Save Isa3v/3723f5345d451a90c13cc1e09d6b134e to your computer and use it in GitHub Desktop.
Добавляем кастомное свойство Привязка к элементу с описанием (с возможностью описание сделать массивом)

Добавляем кастомное свойство Привязка к элементу с описанием (Bitrix)

<?
/**
* У свойства есть только 2 переменные Значение - описание.
* Потому если нам нужно добавить 3,4,5 то лучше это сделать через сериализацию массива описани
* В вывод добавляем еще input, например:
* <input type="text" id="meas" name="'.$strHTMLControlName["DESCRIPTION"].'[1]" value="'.htmlspecialcharsex($arValue["DESCRIPTION"][1]).'" />
* Ну я думаю понятно как ключи массива работают
*
* //dev.1c-bitrix.ru/api_help/iblock/classes/user_properties/index.php - тут очень хорошо расписано о полз. свойствах
* Примеры стандартных свойств лежат тут (/bitrix/modules/iblock/classes/general)
* @author ORWO:ISAEV
* @link https://gist.github.com/Isa3v
*/
//Привязываем к соытию
Bitrix\Main\EventManager::getInstance()->addEventHandler('iblock', 'OnIBlockPropertyBuildList', array('CIBlockPropertyMultiBindProp', 'GetUserTypeDescription'));
class CIBlockPropertyMultiBindProp {
// Информация о данном свойстве
const USER_TYPE = 'multiBindProp';
public static function GetUserTypeDescription() {
return array(
"PROPERTY_TYPE" => "E",
"USER_TYPE" => self::USER_TYPE,
"DESCRIPTION" => "ORWO: Привязка к элементу с описанием",
"GetPropertyFieldHtml" => array(__CLASS__, "GetPropertyFieldHtml"),
"ConvertToDB" => array(__CLASS__, "ConvertToDB"),
"ConvertFromDB" => array(__CLASS__, "ConvertFromDB")
);
}
// Функция вывода свойства в панели
public static function GetPropertyFieldHtml($arProperty, $arValue, $strHTMLControlName) {
// Описание превращаем обратно в массив ( в шаблоне также )
$arValue["DESCRIPTION"] = unserialize($arValue["DESCRIPTION"]);
if (intval($arValue["VALUE"]) > 0) {
$arFilter = Array(
"ID" => intval($arValue["VALUE"]),
"IBLOCK_ID" => $arProperty["LINK_IBLOCK_ID"],
);
//Получаем информацию о элементах по ID
$rsItem = CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "IBLOCK_ID", "NAME"));
$arItem = $rsItem->GetNext();
}
// Что будет выведено:
// jsUtils.OpenWindow... - открывает окно с выбором элемента инфоблока
return '
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="internal">
<tbody>
<tr class="heading">
<td>Элемент</td>
<td>Вкладка</td>
</tr>
<tr>
<td align="center" width="50%">
<input name="'.$strHTMLControlName["VALUE"].'" id="'.$strHTMLControlName["VALUE"].'" value="'.htmlspecialcharsex($arValue["VALUE"]).'" size="5" type="text">
<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);">
<br><span id="sp_'.md5($strHTMLControlName["VALUE"]).'_'.$key.'" >'.$arItem["NAME"].'</span>
</td>
<td align="center">
<input type="text" id="meas" name="'.$strHTMLControlName["DESCRIPTION"].'[0]" value="'.htmlspecialcharsex($arValue["DESCRIPTION"][0]).'" />
</td>
</tr>
</tbody>
</table>
';
}
// При сохранении свойства в БД
public static function ConvertToDB($arProperty, $arValue) {
//Если значение или описание массив, то сериализуем
if (is_array($arValue) && array_key_exists("VALUE", $arValue) && !empty($arValue['VALUE'])) {
$arValue["VALUE"] = serialize($arValue["VALUE"]);
$arValue['DESCRIPTION'] = serialize($arValue["DESCRIPTION"]);
}
return $arValue;
}
// При извлечении значения из БД (по странным причинам сюда не попадает описание)
public function ConvertFromDB($arProperty, $arValue) {
if (is_array($arValue) && array_key_exists("VALUE", $arValue) && !empty($arValue['VALUE'])) {
$arValue["VALUE"] = unserialize($arValue["VALUE"]);
}
//unserialize для описания проводим в выводе шаблона т.к функция передаст тооько строку
return $arValue;
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment