Меню

Обновить свойство "Привязка к пользователю" через API Битрикс

Дано: у элементов есть множественное свойство "Привязка к пользователю". С помощью API нужно обновлять это свойство, добавляя в него пользователя.
При этом с проверкой на существование такого пользователя в системе
Код
// Обработка данных формы
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Идентификатор элемента, который нужно обновить
$elementId = $_POST['EL_ID'];

// Идентификатор пользователя, которого нужно добавить в свойство "Привязка к пользователям"
$userIdToAdd = $_POST['USER_ID'];

// Проверяем существование пользователя
$user = \Bitrix\Main\UserTable::getById($userIdToAdd)->fetch();
if (!$user) {
    echo "Пользователь с ID={$userIdToAdd} не существует в системе.";
    exit;
}

// Получаем текущие значения свойства "Привязка к пользователям" для элемента
$rsProperty = \CIBlockElement::GetProperty(
    16, // ID инфоблока
    $elementId,
    "sort",
    "asc",
    array(
        'CODE' => 'ATT_USERS_IDS'
    )
);

$existingUserIds = array();
while ($arProperty = $rsProperty->Fetch()) {
    if (!empty($arProperty['VALUE'])) {
        $existingUserIds[] = $arProperty['VALUE'];
    }
}

// Добавляем идентификатор нового пользователя, если он не существует в текущих значениях свойства
if (!in_array($userIdToAdd, $existingUserIds)) {
    $existingUserIds[] = $userIdToAdd;

    // Обновляем значение свойства "Привязка к пользователям"
    \CIBlockElement::SetPropertyValueCode($elementId, 'ATT_USERS_IDS', $existingUserIds);
}

}


В моем случае я делаю это из отправки формы передавая ID пользователя и элемента (к которому его надо добавить) через POST запрос

PS:
Чтобы обезопасить предоставленный код и предотвратить компрометацию данных из массива $_POST, рекомендуется применить следующие методы безопасности:

Валидация данных: Проверяйте данные, полученные из массива $_POST, на соответствие ожидаемому формату и типу данных. Например, убедитесь, что идентификатор элемента ($elementId) и идентификатор пользователя ($userIdToAdd) являются числовыми значениями и не содержат опасных символов.

Проверка CSRF: Для защиты от CSRF-атак (межсайтовая подделка запросов), рекомендуется использовать токены CSRF и проверять их перед обработкой формы. В Битриксе можно использовать встроенные возможности защиты от CSRF, такие как bitrix_sessid_post() или bitrix_sessid_get().

Пример с проверкой bitrix_sessid_post()
Форма:
Код
<form action="/local/ajax/submit_vote.php" method="post" class="send_vote">
    <?= bitrix_sessid_post(); ?>
    <input type="hidden" name="EL_ID" value="<?= $arItem['ID'] ?>">
    <input type="hidden" name="USER_ID" value="<?= $arResult['CURRENT_USER_ID'] ?>">
    <button type="submit">
        Проголосовать
    </button>
</form>

Обработчик:
Код
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
Loader::includeModule('main'); // Подключаем модуль "main"

// Проверка CSRF-токена
if (!bitrix_sessid_post_check()) {
    echo "Ошибка! Неверный CSRF-токен.";
    exit;
}

// Обработка данных формы
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Ваш существующий код обработки формы здесь...
    // (включая код для добавления пользователя в свойство "Привязка к пользователям")
}

Скрипт обновляющий элементы AJAX-ом
Код
<script>
    $(function () {
        $(".send_vote").submit(function (event) { // Изменить событие на submit
            event.preventDefault();
            var form = $(this)[0]; // Сохранить элемент формы в переменную
            var formData = new FormData(form);
            $.ajax({
                url: form.action, // Установить правильный URL, куда должны быть отправлены данные формы
                type: form.method,
                data: formData,
                processData: false,
                contentType: false,
                success: function (response) {
                    // Обновить содержимое .vote_list с ответом от сервера
                    $('.vote_list').load(location.href + ' .vote_list');
                },
                error: function () {
                    console.log("Произошла ошибка при отправке запроса."); // Исправленное имя функции
                }
            });
        });
    });
</script>
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

Блог-note: заметки разработчика

Информация о службе доставки по ее ID, в 1С-Битрикс

Задача: зная ID службы доставки получить необходимую информацию о ней, с помощью API 1С-Битрикс

Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс

В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 1С-Битрикс.

Установить остатки товара на складе из доступных остатков.

Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество".

Отсортировать предложения по цене в каталоге 1С-Битрикс

Задача: в 1С-Битрикс есть настройка для вывода предложений по стоимости, но она не функционирует должным образом. Необхо...

Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт

При разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретить изменения полей при обмене. ...

Оптимизация jpeg и png картинок на cron, с помощью jpegoptim и optipng

Задача: на сайт каждый день проходит выгрузка из 1С с обновлением картинок. Нужно оптимизмровать эти картинки с помощью...

Отфильтровать новости в Битрикс за заданный период

Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компонента "список новостей". Для э...

Перенос Битрикс сайта с хостинга на хостинг, инструкция

Достаточно часто спрашивают как перенести сайт работающий на 1С Битрикс с одного хостинга на другой, как раз подвернулас...

Почтовое событие на создание нового элемента инфоблока, через API

Иногда при разработке сайта требуется реализовать функционал добавления элементов инфоблока простыми пользователям.Будет...