+7 (987) 026-06-36
Написать в Telegram

Оставить заявку
stanislav_web

Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс

Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы

Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс

Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы

📅 11 сентября 2024

👁‍🗨 40

🔥 0

Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс
Ранее я делился информацией [ссылка] о том, как создать простой компонент подписки на рассылку через API 1С-Битрикс. Сегодня привожу пример кастомизации стандартного компонента подписки subscribe.simple.

Начиная с редакции "Стандарт" для 1С-Битрикс в административной панели появляется модуль "Рассылки". Для начала нас интересует пункт "Список рассылок" https://ваш_домен/bitrix/admin/rubric_admin.php.

На изображении анонса данной статьи видно, что рубрики отображены не просто списком чекбоксов, а также списком подрубрик, в данном случае есть рубрика "Новости" которая имеет подрубрики "Все" и "Выставка".

Не долго думая, я понимаю, что можно будет объединить рубрики по символьному коду, чтобы создать своего рода группу.

Я добавил все рубрики с указанием символьного кода, а также проставил сортировку, чтобы потом сформировать нужный мне массив и вывести их по индексу.

Кастомизация стандартного компонента подписки subscribe.simple на 1С-Битрикс

Теперь переходим к логике компонента.

Можно перенести в своё пространство имён, но я приведу пример из пространства 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']]);
    }
}
?>
И теперь остаётся перейти в файл шаблона /local/templates/s1/components/bitrix/subscribe.simple/subscribe/template.php и циклом с правилами вывести наши рубрики.
<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>
        <? } ?>
    <? } ?>
<? } ?>