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

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

Задача: дать пользователям возможность отписаться от всех рассылок "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>