Пользовательское поле: текст с описанием
Через наследование \Bitrix\Main\UserField\Types\StringType
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnUserTypeBuildList", ['propStringDesc', "getUserTypeDescription"]); class propStringDesc extends \Bitrix\Main\UserField\Types\StringType { public static function getDescription(): array { return array( "USER_TYPE_ID" => 'PropStringDesc', "CLASS_NAME" => __CLASS__, "DESCRIPTION" => 'Строка с описанием', "BASE_TYPE" => 'string', ); } public static function checkFields(array $userField, $value): array { return []; } public static function OnBeforeSave($arUserField, $value): string { $value = \Bitrix\Main\Web\Json::encode($value); return $value; } public static function OnAfterFetch($arProperty, $arValue): array { if (!empty($arValue["VALUE"])) { $arValue = \Bitrix\Main\Web\Json::decode(html_entity_decode($arValue["VALUE"])); } return $arValue; } }
Помимо класса, понадобится кастомизация шаблона компонента main.field.string:main.edit_form, нужно закинуть его в дефолтный шаблон и изменить вывод поля редактирования:
if ($value['tag'] === 'input') { $attList = $value['attrList']; if ($arResult["userField"]["USER_TYPE_ID"] === 'PropStringDesc') { $attList["value"] = $value['attrList']["value"]['NAME']; $attList['placeholder'] = 'Текст'; $attList["name"] .= '[NAME]'; } ?> <input <?= $component->getHtmlBuilder()->buildTagAttributes($attList) ?> > <?php if ($arResult["userField"]["USER_TYPE_ID"] === 'PropStringDesc') { $attList = $value['attrList']; $attList["value"] = $value['attrList']["value"]['DESC']; $attList["name"] .= '[DESC]'; $attList['placeholder'] = 'Ссылка'; ?> <input <?= $component->getHtmlBuilder()->buildTagAttributes($attList) ?> > <?php } }
Другие компоненты (вывод и редактирование в списке) тоже нужно кастомизировать. Но проще запретить выводить в свойство списке =)
Есть вопрос или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.