Самостоятельное удаление аккаунта пользователя в Bitrix

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

Задача: дать пользователю возможность удалить свою учетную запись на сайте. При этом будут заархивированы и все заказы пользователя

Архивирование заказов пользователя:

В кабинете пользователя на нужной странице добавляем форму с кнопкой удаления:

<form action="" method="post">
    <input type="hidden" name="CONFIRM_DELETE" value="Y">
    <button type="submit" class="btn btn-danger">
        Удалить аккаунт
    </button>
    Внимание! Удаление аккаунта необратимо, восстановление невозможно
</form>

В интернет магазине необходимо удалить или заархивировать заказы пользователя, иначе система не даст удалить пользователя. Будем архивировать методом Bitrix\Sale\Order\Manager::archiveOrders, чтобы заказы остались для истории продаж Обработчик формы:


// Если не авторизован отправляем на главную
if (!$USER->IsAuthorized()) {
    LocalRedirect('/');
    exit;
}

use Bitrix\Main\Application,
    Bitrix\Main\Engine\CurrentUser,
    Bitrix\Sale\Archive\Manager,
    Bitrix\Sale\Order;

// ID пользователя
$arResult['USER_ID'] = CurrentUser::get()->getId();

//  Работа с запросом
$request = Application::getInstance()->getContext()->getRequest();
$deleteUser = $request->getPost('CONFIRM_DELETE');

if ($deleteUser === 'Y') {
    $user = new CUser;
        // Получаем заказы связанные с пользователем
        $dbResOrders = Order::getList([
            'filter' => [
                "=USER_ID" => $arResult['USER_ID'],
            ],
            'select' => [
                'ID' // Нужен только ID
            ],
        ])->fetchAll();
        $arOrders = [];
        foreach ($dbResOrders as $dbResOrder) {
            $arOrders[] = $dbResOrder['ID'];
        }
        // Архивируем заказы
        if (!empty($arOrders)) {
            Manager::archiveOrders(
                [
                    'ID' => $arOrders
                ]
            );
        }
        // Удаляем пользователя
        CUser::Delete($arResult['USER_ID']);
        // После удаления редирект на главную
        LocalRedirect('/');
        exit;
}

Если нужно просто деактивировать пользователя, то вместо удаления можно просто обновить поле ACTIVE пользователя:


$arFields = array(
    'ACTIVE' => 'N',
);
$user->Update(
    $arResult['USER_ID'],
    $arFields
);

Компонент удаления пользователя

На базе этой заметки сделал готовый компонент удаления пользователя:
Скачать

У компонента всего одна настройка - "Режим работы":
- Удалить пользователя
- Деактивировать пользователя

Пример настроки компонента в Битрикс

После установки компонент можно найти в разделе "Служебные -> Пользователь" в списке компонентов.

Код component.php компонента:


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

use Bitrix\Main\Application,
    Bitrix\Main\Engine\CurrentUser,
    Bitrix\Sale\Archive\Manager,
    Bitrix\Sale\Order;


// Если не авторизован отправляем на главную
if (!$USER->IsAuthorized()) {
    LocalRedirect('/');
    exit;
}

// ID пользователя
$arResult['USER_ID'] = CurrentUser::get()->getId();

//  Работа с запросом
$request = Application::getInstance()->getContext()->getRequest();
$deleteUser = $request->getPost('CONFIRM_DELETE');


if ($deleteUser === 'Y') {
    $user = new CUser;
    if ($arParams['MODE_SWITCHER'] == 'DEACTIVATE_USER_ACC') {
        // Если режим деактивации, просто деактивируем пользователя
        // Не трогая заказы
        $arFields = array(
            'ACTIVE' => 'N',
        );
        $user->Update(
            $arResult['USER_ID'],
            $arFields
        );
        LocalRedirect('/');
        exit;
    } else {
        // Если удаление, архивируем все заказы пользователя
        // получаем заказы связанные с пользователем
        $dbResOrders = Order::getList([
            'filter' => [
                "=USER_ID" => $arResult['USER_ID'],
            ],
            'select' => [
                'ID' // Нужен только ID
            ],
        ])->fetchAll();
        $arOrders = [];
        foreach ($dbResOrders as $dbResOrder) {
            $arOrders[] = $dbResOrder['ID'];
        }
        // Архивируем заказы
        if (!empty($arOrders)) {
            Manager::archiveOrders(
                [
                    'ID' => $arOrders
                ]
            );
        }
        CUser::Delete( $arResult['USER_ID']);
        LocalRedirect('/');
        exit;
    }
}

$this->includeComponentTemplate();

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 400 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 250 000 руб. от 1-го месяца

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфресурс

от 300 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 30 000 руб. от 2-х дней

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