<?php
namespace Helper;
use App\Customer;
class UserHelper
{
public static function userGroupChangeHandler(array &$arFields)
{
// Проверяем, что изменяются группы пользователя
if (isset($arFields['GROUP_ID'], $arFields['ID']) && is_array($arFields['GROUP_ID'])) {
$userId = $arFields['ID'];
$targetGroupId = Customer::getGroupWholesaleId(); // Id группы Опт. Покупателей
// Получаем текущие группы пользователя до изменения
$currentUserGroups = \CUser::GetUserGroup($userId);
// Проверяем, состоит ли пользователь в целевой группе на данный момент
$wasInTargetGroup = in_array($targetGroupId, $currentUserGroups);
// Проверяем, будет ли пользователь в целевой группе после изменения
$willBeInTargetGroup = false;
foreach ($arFields['GROUP_ID'] as $groupData) {
if (is_array($groupData) && isset($groupData['GROUP_ID'])) {
if ($groupData['GROUP_ID'] == $targetGroupId) {
$willBeInTargetGroup = true;
break;
}
} elseif ($groupData == $targetGroupId) {
$willBeInTargetGroup = true;
break;
}
}
// Устанавливаем период только если пользователь НЕ состоял в группе, но теперь будет в ней
if (!$wasInTargetGroup && $willBeInTargetGroup) {
self::setUserGroupPeriod($arFields, $targetGroupId);
}
}
}
/**
* Устанавливает период активности для группы пользователя
*
* @param array $arFields Массив полей пользователя
* @param int $targetGroupId ID целевой группы
*/
private static function setUserGroupPeriod(array &$arFields, int $targetGroupId): void
{
// Получаем текущую дату и время
$currentDateTime = new \DateTime();
$dateActive = $currentDateTime->format('d.m.Y H:i:s');
// Добавляем 1 год к текущей дате
$currentDateTime->add(new \DateInterval('P1Y'));
$dateExpire = $currentDateTime->format('d.m.Y H:i:s');
// Проходим по всем группам и устанавливаем период для целевой группы
foreach ($arFields['GROUP_ID'] as $key => $groupData) {
if (is_array($groupData) && isset($groupData['GROUP_ID'])) {
if ($groupData['GROUP_ID'] == $targetGroupId) {
$arFields['GROUP_ID'][$key]['DATE_ACTIVE_FROM'] = $dateActive;
$arFields['GROUP_ID'][$key]['DATE_ACTIVE_TO'] = $dateExpire;
}
} elseif ($groupData == $targetGroupId) {
// Преобразуем в массив с периодом
$arFields['GROUP_ID'][$key] = [
'GROUP_ID' => $targetGroupId,
'DATE_ACTIVE_FROM' => $dateActive,
'DATE_ACTIVE_TO' => $dateExpire,
];
}
}
}
}
Назначение кода:
Данный код реализует автоматическое ограничение срока действия группы пользователей (в данном случае — группы "Оптовые покупатели") при её назначении. При первом добавлении пользователя в целевую группу для него устанавливается период активности ровно на 1 год. По истечении этого срока Битрикс автоматически исключит пользователя из группы.
Ключевые компоненты:
-
Обработчик события
OnBeforeUserUpdateСрабатывает перед обновлением данных пользователя в Битрикс. Анализирует изменения в группах пользователя. -
Логика работы
userGroupChangeHandler:- Проверяет, что обновление затрагивает группы пользователя (
GROUP_ID). - Определяет ID целевой группы через
Customer::getGroupWholesaleId(). - Сравнивает:
- Принадлежал ли пользователь к группе до обновления (
wasInTargetGroup). - Будет ли в группе после обновления (
willBeInTargetGroup).
- Принадлежал ли пользователь к группе до обновления (
- Если пользователь впервые добавлен в группу → вызывает метод
setUserGroupPeriod().
- Проверяет, что обновление затрагивает группы пользователя (
-
Установка периода активности (
setUserGroupPeriod):- Генерирует даты начала (
DATE_ACTIVE_FROM) и окончания (DATE_ACTIVE_TO):- Начало: текущая дата/время.
- Окончание: текущая дата + 1 год.
- Модифицирует массив
$arFields['GROUP_ID']:- Для существующей записи группы добавляет период.
- Если группа передана как ID (число) → преобразует в детальную запись.
- Генерирует даты начала (
Зачем это нужно?
- Автоматизация срока действия привилегий
Например, предоставление статуса "Оптовый покупатель" на ограниченный период (1 год) без ручного управления сроком. - Гибкое управление группами
Обработка любых сценариев обновления групп (массив с ID или структурированными данными). - Интеграция с бизнес-логикой
Использует кастомный методCustomer::getGroupWholesaleId()для определения целевой группы.
Как подключено?
В init.php обработчик регистрируется на событие ядра Битрикс:
<?php
use Bitrix\Main\EventManager;
$eventManager = EventManager::getInstance();
// User
$eventManager->addEventHandler('main', 'OnBeforeUserUpdate', [Helper\UserHelper::class, 'userGroupChangeHandler']);
Важный момент:
- Обновление пользователя
Обработчик срабатывает только при обновлении существующего пользователя, но не при создании. Если нужно обрабатывать и создание, то следует также подписаться на событиеOnBeforeUserAdd
Типовой сценарий: Администратор добавляет пользователя в группу "Оптовые покупатели" → система автоматически устанавливает срок действия группы до 02.06.2026 (текущая дата + 1 год) → через год Битрикс автоматически удалит пользователя из группы.