Речь идет о коробке Битрикс 24

Задача была изменить дефолтные настройки Мессенжера (по факту не только его) у пользователей.

  1. Отключить отправку уведомлений на почту, по дефолту, у всех новых пользователей.

  2. Отключить чтобы при открытии чата в браузере не запускалось десктопное приложение. Причем даже если пользователь включит эту опцию она вернулась назад.

Храниться вся эта прелесть в таблице b_im_option_state в ней используются не ID пользователей а так называемых групп.
Таблица с этими группами b_im_option_group там уже есть привязка к Пользователю (По факту 1 пользователь одна группа).

Настройки эти создаются только тогда - когда настройки были первый раз изменены. До этого видимо применяются значения по умолчанию в самих скриптах обработчиках
В стиле "В базе ничего нет, значит будет так..."

  1. Вешаем обработчик на событие создания пользователя.

use \Bitrix\Main\EventManager;
// После добавления нового Пользователя
EventManager::getInstance()->addEventHandler("main", "OnAfterUserAdd", function(&$arFields) {
    Loader::includeModule("im");
    $userId = $arFields["ID"];
// Получаем массив со всеми настройками
    $userSettings = CIMSettings::Get($userId);
// Меняем только нужный параметр
    $settings = $userSettings['settings']; // Выбираем общие настройки
    $settings['notifySchemeSendEmail'] = false; // Устанавливаем параметр

// Сохраняем обратно
    $res = CIMSettings::Set(
        "settings", // Общие настройки
        $settings,
        $userId
    );
    \CIMSettings::ClearCache($userId);

});

2.Скрипт cron выполняющийся раз в день, устанавливает нужный параметр для всех новых пользователей и сбрасывает у всех кто его поменял. Можно было делать и через CIMSettings::Set. Но мне данный вариант понравился больше + хотел показать что можно и так. (Да, да в Битрикс работать с базой напрямую нельзя, мы про это помним ... и скорбим).

$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/www";
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

global $DB;

$DB->Query("
    UPDATE b_im_option_state
    SET VALUE = 'N'
    WHERE NAME = 'se|openDesktopFromPanel' AND VALUE = 'Y'
");

P.S. Кстати в новом мессенжере конкретно этой опции больше нет, в битрикс поняли что она тупая. Но пример я оставил, может кто будет так сносить другую настройку.

Комментарии (0)