Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Быстрая отписка от всех рассылок модуля "E-mail маркетинг", в кабинете пользователя

Просмотров: 283

Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не только по ссылке из письма, но и в персональном разделе- по нажатию одной кнопки.

Быстрая отписка от всех рассылок модуля E-mail маркетинг, в кабинете пользователя

Компонент быстрого отказа от рассылки

Что бы сделать это гибким и не набрасывать код прямо на странице, создадим компонент. Компонент будет без параметров, по этому достаточно простой. Ниже, можно будет скачать уже готовый.

В файле component.php размещаем код.

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

use Bitrix\Main\Loader;

Loader::includeModule('sender');

global $USER;

if ($USER->IsAuthorized()) {
    $rsUser = CUser::GetByID($USER->GetID());
    $arUser = $rsUser->Fetch();
    
    $subscriptionDb = \Bitrix\Sender\MailingSubscriptionTable::getSubscriptionList(array(
        'select' => array('IS_UNSUB'),
        'filter' => array(
            '=CONTACT.CODE' => $arUser['EMAIL'],
        ),
    ));
    while (($subscription = $subscriptionDb->fetch())) {
        $arResult['USER_IS_UNSUB'] = $subscription['IS_UNSUB'];
    }

    if ($_POST['UNSUBSCRIBE'] === 'UNSUBSCRIBE') {
        $contact_id = \Bitrix\Sender\ContactTable::addIfNotExist(
            array(
                'EMAIL' => $arUser['EMAIL']
            )
        );
        $contact = new \Bitrix\Sender\Entity\Contact($contact_id);

        $subList = $contact->loadData($contact_id);
        $subList = $subList['SUB_LIST'];
        foreach ($subList as $item) {
            $contact->unsubscribe($item);
        }
    }
} else {
    LocalRedirect('/');
}

$this->IncludeComponentTemplate();

Здесь мы получили e-mail текущего, авторизованного пользователя и с помощью \Sender\MailingSubscriptionTable::getSubscriptionList узнали, есть ли у пользователя активные подписки.

Достаточно отобрать по полю IS_UNSUB, у пользователей без подписки или с неподтвержденной подпиской, весь результат будет пустым. Из этого поля создали $arResult['USER_IS_UNSUB']

Далее получаем все подписки пользоватея зная его E-MAIL и если $_POST['UNSUBSCRIBE' передан, отписываем от всех подписок методом $contact->unsubscribe();

Также выполнили проверку на авторизацию пользователя. Если пользователь не авторизован-то отправялется на главную страницу.

Выводим форму отписки

В template.php выводим форму:

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);

if ($arResult['USER_IS_UNSUB'] === 'N') {?>
    <form method="post" action="">
        <input type="hidden" name="UNSUBSCRIBE" value="UNSUBSCRIBE"/>
        <button>
           Отписаться от рассылки
        </button>
    </form>
<?}else{?>
    У вас нет подписок
<?}?>

Здесь, проверили на наличие $arResult['USER_IS_UNSUB']: если ключ есть то показываем поле, со скрытым input и кнопкой отправки. Иначе, оповестили пользователя что у него подписок нет и отписываться не от чего. Готовый компонент можно скачать по ссылке:

Скачать компонент

Закидываем компонент в директорию "/local/components/bazarow" и вызываем в нужном месте сайта:

$APPLICATION->IncludeComponent(
	"bazarow:unsuscribe.all.sender",
	"",
Array()
);

На этом все, дизайн можно сделать под себя. По желанию добавить оповещение перед отправкой "А вы действительно хотите отписаться" и прочие красивости.

Михаил Базаров 17.02.2023
Вариант с показом подтверждения отказа от подписки. Просто вызываем alert перед отправкой формы.
Пользователь может передумать отписываться
Код
<form method="post" action="" onsubmit="return confirm('Подтвердите отписку от рассылок.');">
        <input type="hidden" name="UNSUBSCRIBE" value="UNSUBSCRIBE"/>
        <button>
           Отписаться от рассылки
        </button>
    </form>

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Пункты меню из разделов инфоблока Битрикс Просмотров: 93319 В принципе это стандартная возможность системы управления битрикс, но почему-то часто спра... Перенос Битрикс сайта с хостинга на хостинг, инструкция Просмотров: 27427 Достаточно часто спрашивают как перенести сайт работающий на 1С Битрикс с одного хостинга ... Сравнение двух типов цен для иммитации системы скидок, в Битрикс Просмотров: 6851 Встала задачка, иммититровать систему скидок в интернет магазине на Битрикс. Из 1С-УТ, на ... Дополнительные опции/услуги, добавляемые в корзину, в карточке товаро... Просмотров: 1071 Задача: в детальной карточке товара сделать возможность добавления услуги или опции, при д... Дать пользователю возможность быстро отредактировать материал Просмотров: 4969 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Вывести минимальную и максимальную цену в разделе каталога Битрикс. Просмотров: 3689 Что бы вывести минимальную и максимальную стоимость товаров, из каталога 1С-Битрикс, доста... Вывод элементов с помощью API битрикс Просмотров: 24002 Иногда, выводить элементы инфоблока с помощью компонентов, может оказаться избыточным. Нап... Вывести информацию, только на первом уровне раздела каталога, в 1С-Би... Просмотров: 5606 Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента по... Отфильтровать товары бренда и вывести по разделам каталога Просмотров: 1660 Задача: на странице бренда, который выводится компонентом новостей, нужно показать все тов... Memcached на сайте под управлением битрикс, при использовании Веб Окр... Просмотров: 7838 Если вам важна скорость отдачи сайта, а у вашего сервера медленный диск для использования ... Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 1194 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п... Следующая/предыдущая новость/статья при просмотре подробной в Битрикс Просмотров: 18304 Дизайн создается только для наглядного и удобного предоставления содержимого сайта, пользо... Цвета торговых предложений из Highload инфоблоков в списке товаров Просмотров: 14935 Подвернулся на доработку очень старый сайт, работал еще на 11-ой версии Битрикс. Выполнили... Вывести дату окончания скидки в карточке товара Просмотров: 4533 Если нужно вывести информацию о скидке в карточке товара, можно воспользоваться методом Фотогалерея на базе компонента новостей, с fancybox. Просмотров: 2954 Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогал... Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5877 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ... Не дать пользователю купить больше одного товара, в Битрикс Просмотров: 5887 Иногда нужно и такое: Например: на одном из разрабатываемых сайтов, мне нужно было создать... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 38009 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... AJAX корзина с отправкой количества из раздела каталога Просмотров: 20192 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 24582 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в...