Установить период активности группы пользователей. Битрикс API

<?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 год. По истечении этого срока Битрикс автоматически исключит пользователя из группы.


Ключевые компоненты:

  1. Обработчик события OnBeforeUserUpdate Срабатывает перед обновлением данных пользователя в Битрикс. Анализирует изменения в группах пользователя.

  2. Логика работы userGroupChangeHandler:

    • Проверяет, что обновление затрагивает группы пользователя (GROUP_ID).
    • Определяет ID целевой группы через Customer::getGroupWholesaleId().
    • Сравнивает:
      • Принадлежал ли пользователь к группе до обновления (wasInTargetGroup).
      • Будет ли в группе после обновления (willBeInTargetGroup).
    • Если пользователь впервые добавлен в группу → вызывает метод setUserGroupPeriod().
  3. Установка периода активности (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']);

Важный момент:

  1. Обновление пользователя 
    Обработчик срабатывает только при обновлении существующего пользователя, но не при создании. Если нужно обрабатывать и создание, то следует также подписаться на событие OnBeforeUserAdd

Типовой сценарий: Администратор добавляет пользователя в группу "Оптовые покупатели" → система автоматически устанавливает срок действия группы до 02.06.2026 (текущая дата + 1 год) → через год Битрикс автоматически удалит пользователя из группы.