Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс
Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работыКастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс
Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы
📅 11 сентября 2024
👁🗨 40
Начиная с редакции "Стандарт" для 1С-Битрикс в административной панели появляется модуль "Рассылки". Для начала нас интересует пункт "Список рассылок" https://ваш_домен/bitrix/admin/rubric_admin.php.
На изображении анонса данной статьи видно, что рубрики отображены не просто списком чекбоксов, а также списком подрубрик, в данном случае есть рубрика "Новости" которая имеет подрубрики "Все" и "Выставка".
Не долго думая, я понимаю, что можно будет объединить рубрики по символьному коду, чтобы создать своего рода группу.
Я добавил все рубрики с указанием символьного кода, а также проставил сортировку, чтобы потом сформировать нужный мне массив и вывести их по индексу.
Теперь переходим к логике компонента.
Можно перенести в своё пространство имён, но я приведу пример из пространства bitrix.
Открываем файл /bitrix/components/bitrix/subscribe.simple/component.php и видим, что на строке 145 в методе $obSubscription->Add переменная EMAIL принимает почту текущего пользователя $USER->GetEmail().
Меняем на $_POST['EMAIL'] если будем передавать почту которую укажут в форме подписки.
Для моей реализации подрубрик как писал выше понадобится индекс сортировки и символьный код.
В массиве который формирует компонент, нет этих полей, поэтому спускаемся до 242 строки и в массив $arResult['RUBRICS'] добавляем две необходимые нам переменные 'CODE' => $arRubric['CODE'] и 'SORT' => $arRubric['SORT'].
<?
$ID = $obSubscription->Add([
'USER_ID' => $USER_ID,
'ACTIVE' => 'Y',
'EMAIL' => $_POST['EMAIL'], // Меняем $USER->GetEmail() на $_POST['EMAIL']
'FORMAT' => ($_POST['FORMAT'] !== 'html' ? 'text' : 'html'),
'CONFIRMED' => 'Y',
'SEND_CONFIRM' => 'N',
'RUB_ID' => $arNewRubrics,
]);
$arResult['RUBRICS'][] = [
'ID' => $arRubric['ID'],
'CODE' => $arRubric['CODE'], // Добавляем в массив символьный код
'SORT' => $arRubric['SORT'], // Добавляем в массив индекс сортировки
'NAME' => $arRubric['NAME'],
'DESCRIPTION' => $arRubric['DESCRIPTION'],
'CHECKED' => array_key_exists($arRubric['ID'], $arResult['RUB_ID']),
];
?>
Теперь переходим в шаблон /local/templates/s1/components/bitrix/subscribe.simple/subscribe/ и создаём файл result_modifier.php в котором формируем новый массив $arResult['RUBRICS_CUSTOM'].
<?
$arResult['RUBRICS_CUSTOM'] = [];
foreach ($arResult['RUBRICS'] as $key => $item) {
$arResult['RUBRICS_CUSTOM'][$item['CODE']][] = $item;
}
foreach ($arResult['RUBRICS_CUSTOM'] as $key => $item) {
foreach ($item as $key2 => $item2) {
$arResult['RUBRICS_CUSTOM'][$item[0]['SORT']][] = $item2;
unset($arResult['RUBRICS_CUSTOM'][$item2['CODE']]);
}
}
?>
<input placeholder="Подпишитесь на нашу рассылку" required name="EMAIL" type="email" value="<?= $USER->IsAuthorized() ? $USER->GetEmail() : ''; ?>">
<button name="Update" value="<?= GetMessage('CT_BSS_FORM_BUTTON'); ?>" type="submit">
<span>Полетели</span>
</button>
<? foreach ($arResult['RUBRICS_CUSTOM'] as $key => $arRubric) { ?>
<? if ($key == 10) { // Ставим проверку на первую рубрику с индексом сортировки 10 ?>
<input name="RUB_ID[]" type="checkbox" value="<?= $arRubric[0]['ID']; ?>" id="RUB_<?= $arRubric[0]['ID']; ?>"<?= ($arRubric[0]['CHECKED']) ? ' checked' : ''; ?>>
<span class="checkbox__label"><?= $arRubric[0]['NAME']; ?></span>
<? } else { ?>
<? if (count($arRubric) > 1) { // Так как группа рубрик будет иметь более 1 ключа, ставим проверку ?>
<input name="RUB_ID[]" type="checkbox" value="<?= $arRubric[0]['ID']; ?>" id="RUB_<?= $arRubric[0]['ID']; ?>"<?= ($arRubric[0]['CHECKED']) ? ' checked' : ''; ?>>
<span class="checkbox__label"><?= $arRubric[0]['NAME']; ?></span>
<div>
<? foreach ($arRubric as $item) { ?>
<input name="RUB_ID[]" type="checkbox" value="<?= $item['ID']; ?>" id="RUB_<?= $item['ID']; ?>"<?= ($item['CHECKED']) ? ' checked' : ''; ?>>
<span class="checkbox__label"><?= $item['NAME']; ?></span>
<? } ?>
</div>
<? } else { // Остальные рубрики пойдут по индексу ?>
<input name="RUB_ID[]" type="checkbox" value="<?= $arRubric[0]['ID']; ?>" id="RUB_<?= $arRubric[0]['ID']; ?>"<?= ($arRubric[0]['CHECKED']) ? ' checked' : ''; ?>>
<span class="checkbox__label"><?= $arRubric[0]['NAME']; ?></span>
<? } ?>
<? } ?>
<? } ?>