Наверняка сталкивались с такой проблемой, когда у вас есть готовая верстка web-формы и вы пытаетесь ее внедрить в шаблон компонента bitrix:form.result.new. Но в массиве данных $arResult нет чистого кода для input[type="checkbox"] и input[type="radio"], а есть код в котором кроме самого поля, дополнительно присутствует тег <label>, который очень мешает.
Для решения этой проблемы многие "умельцы" используют регулярные выражения, что бы вырезать все лишнее и оставить чистый input.
Но как все мы знаем, что после обновления CMS 1С-Битрикс, очень многое может поменяться, в том числе может быть изменен HTML-код полей в форме. И достаточно вероятно что регулярное выражение уже не будет работать или будет работать с ошибками. По этой причине я предлагаю альтернативный вариант.
Я открыл код самого компонента bitrix:form.result.new и нашел в нем кусок кода отвечающий за HTML-код полей.
На самом деле все очень просто, там используются стандартные методы 1С-Битрикс.
<?
//Пробегаемся по списку всех вопросов
foreach ($arResult['QUESTIONS'] as $FIELD_SID => $arQuestion) {
if ($arQuestion['STRUCTURE'][0]['FIELD_TYPE'] == 'checkbox') {
//Если тип вопроса checkbox
//Открываем контейнер для вопроса и выводим название вопроса с пометкой обязателен ответ или нет
?>
<div class="field">
<p><?=$arQuestion['CAPTION']?><?=$arQuestion['REQUIRED'] == 'Y' ? '*' : ''?></p>
<?
//Вариантов ответа может быть несколько и для каждого свой checkbox, поэтому пробегаемся по всем ответам и для каждого получаем HTML-код
foreach ($arResult['arAnswers'][$FIELD_SID] as $arAnswer) {
//Получаем значение текущего ответа
$value = \CForm::GetCheckBoxValue(
$FIELD_SID,
$arAnswer,
$arResult['arrVALUES']
);
//Получаем HTML-код для input[type="checkbox"]
$inputHtml = \CForm::GetCheckBoxField(
$FIELD_SID,
$arAnswer['ID'],
$value,
$arAnswer['FIELD_PARAM'] //Это параметр ответа, который заполняется при создании вопроса web-формы, тут может быть например class="checkbox"
);
//Тут выводим сам инпут, можем его обернуть в нужные теги, например
?>
<label><?=$inputHtml?> <span><?=$arAnswer['VALUE']?></span></label>
<?
}
?>
</div>
<?
} elseif ($arQuestion['STRUCTURE'][0]['FIELD_TYPE'] == 'radio') {
//Если тип вопроса radio
//Открываем контейнер для вопроса и выводим название вопроса с пометкой обязателен ответ или нет
?>
<div class="field">
<p><?=$arQuestion['CAPTION']?><?=$arQuestion['REQUIRED'] == 'Y' ? '*' : ''?></p>
<?
//Вариантов ответа может быть несколько и для каждого свой radio, поэтому пробегаемся по всем ответам и для каждого получаем HTML-код
foreach ($arResult['arAnswers'][$FIELD_SID] as $arAnswer) {
//Получаем значение текущего ответа
$value = \CForm::GetRadioValue(
$FIELD_SID,
$arAnswer,
$arResult['arrVALUES']
);
//Получаем HTML-код для input[type="radio"]
$inputHtml = \CForm::GetRadioField(
$FIELD_SID,
$arAnswer['ID'],
$value,
$arAnswer['FIELD_PARAM'] //Это параметр ответа, который заполняется при создании вопроса web-формы, тут может быть например class="radio"
);
//Тут выводим сам инпут, можем его обернуть в нужные теги, например
?>
<label><?=$inputHtml?> <span><?=$arAnswer['VALUE']?></span></label>
<?
}
?>
</div>
<?
} elseif ($arQuestion['STRUCTURE'][0]['FIELD_TYPE'] == 'hidden') {
//Если тип вопроса hidden
echo $arQuestion['HTML_CODE'];
} else {
//У других типов не добавляется ничего лишнего, поэтому просто выводим их код
?>
<div class="field">
<p><?=$arQuestion['CAPTION']?><?=$arQuestion['REQUIRED'] == 'Y' ? '*' : ''?></p>
<?=$arQuestion['HTML_CODE']?>
</div>
<?
}
}
?>