Архивирование заказов пользователя:
В кабинете пользователя на нужной странице добавляем форму с кнопкой удаления:
<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();