Свой шаблон system.field.edit для пользовательских свойств (полей) 1C-Bitrix
Если вам, как в своё время и мне, необходимо доработать или разработать новую регистрацию или, например, личный кабинет пользователя (профиль), то перед вами может стоять задача изменения вида (вёрстки) редактируемых пользовательских свойств (полей). У меня был опыт изменения вида того или иного элемента (поля) без затрагивания вёрстки. Делал я всё исключительно на CSS, что, подразумеваю, могли пробовать и вы, но в некоторых случаях всё же стоит прибегнуть к изменению HTML-кода.
По традиции, в этом посте поделюсь с вами тем, что пробовал я и что, в конечном итоге, дало желаемый результат.
Итак, предположим, что я сделал свою страницу регистрации с использованием компонента настраиваемой регистрации bitrix:main.register. Набор полей стандартный, но я создал и вывел своё поле (свойство) с типом «Строка»:
И сейчас мне нужно изменить вёрстку этого поля. Что я пробовал? Первое, и как бы правильное с точки зрения правил (рекомендаций) кастомизации CMS 1C-Bitrix, это то, что я создал в папке темы сайта подпапки /components/bitrix/system.field.edit/ с соответствующей вложенностью и скопировал в неё папку string из пути /bitrix/components/bitrix/system.field.edit/templates/. После я внёс правки в файл template.php, и, как вы думаете, что произошло? Правильно, ничего.
Чтобы проверить, в чём может быть дело, я отредактировал оригинальный файл вёрстки template.php по пути /bitrix/components/bitrix/system.field.edit/templates/, и это также не дало никакого результата. Что интересно, вёрстка в файле и на сайте не совпадают (как минимум разные классы). Значит, вёрстка для этого типа полей берётся из другого места. Хорошо, подумал я (хотя не хорошо), и попробовал сменить стандартное название шаблона поля string.
Для этого я отредактировал шаблон компонента настраиваемой регистрации bitrix:main.register. В нём нас интересует часть, похожая на:
<?$APPLICATION->IncludeComponent(
'bitrix:system.field.edit',
$arUserField['USER_TYPE']['USER_TYPE_ID'],
array(
'bVarsFromForm' => $arResult['bVarsFromForm'],
'arUserField' => $arUserField,
'form_name' => 'regform'
),
null,
array(
'HIDE_ICONS'=>'Y'
)
);?>
Заменил её на:
<?$APPLICATION->IncludeComponent(
'bitrix:system.field.edit',
$field_type,
array(
'bVarsFromForm' => $arResult['bVarsFromForm'],
'arUserField' => $arUserField,
'form_name' => 'regform'
),
null,
array(
'HIDE_ICONS'=>'Y'
)
);?>
и до неё добавил:
<?
$field_type = $arUserField['USER_TYPE']['USER_TYPE_ID'];
if($field_type == 'string') {
$field_type = 'custom-string';
}
?>
И переименовал папку «string» из пути /папка темы/components/bitrix/system.field.edit/ в «custom-string».
Нерезультативное действие. Почему? Потому что ранее мы (я) уже выяснили, что вёрстка созданного поля берётся не из этого места в принципе.
Поискав информацию на этот счёт в Интернете, я встретил сообщения о том, что у некоторых сработали эти способы, но, к сожалению, не у меня. Помимо этого нашёл одно интересное замечание, в котором говорится, что если исследовать массив пользовательских полей $arUserField['USER_TYPE'] в переобходе foreach:
<?foreach ($arResult["USER_PROPERTIES"]["DATA"] as $FIELD_NAME => $arUserField):?>
<?var_dump($arUserField['USER_TYPE']);?>
то можно обнаружить элемент с ключом USE_FIELD_COMPONENT, имеющий значение true. Сменим его на false:
<?foreach ($arResult["USER_PROPERTIES"]["DATA"] as $FIELD_NAME => $arUserField):?>
<?$arUserField['USER_TYPE']['USE_FIELD_COMPONENT'] = false;?>
var_dump() при этом нужно удалить. Тогда подключится шаблон полей уже из папки string (в моём случае) по пути /папка темы/components/bitrix/system.field.edit/. А вот это уже то, что нам нужно. Помимо этого, здесь начинает работать (при изменении кода компонента) и условие смены стандартного названия темы (папки) поля из описанного примера выше.
Вроде бы всё. Если остались вопросы – милости прошу в комментарии. Всем интересных разработок!