Разработка на 1С-Битрикс Михаил Базаров
Блог-note

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

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

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

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

<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С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс