Меню

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

RSS
Обновить свойство "Привязка к пользователю" через API Битрикс, Задача: через 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>
Изменено: Михаил Базаров - 19.07.2023 09:30:51
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

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

Многосайтовость битрикс на разных доменах и поддоменах

Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать небольшое видео в котором уст...

Вывести множественное свойство типа файл с названием и весом файла в Битрикс

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

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

Номера страниц в Title и Description при постраничной навигации каталога

Задача: Часто SEO-специалисты просят добавить номер страницы, из постраничной навигации, в заголовок и описание раздела ...

INPUT type="file" Предпросмотр превью картинки до загрузки

Рассмотрим на примере компонента "Форма добавления-редактирования элементов инфоблока", как сделать ее более удобной для...

Обновить страницу Inapbrowser в приложении Apache Cordova, при выходе из фона

Задача: Мобильное приложение, созданное на Apache Cordova должно перезагрузить текущую страницу, открытую с помощью плаг...

Отключить поиск по описаниям товаров в Битрикс

Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разработке сайтов на Битрикс. Сдел...

Получение местоположений через API Битрикс c поиском по select.

Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Битрикс. Данные местоположения м...

Прятать или показывать описание раздела каталога

В новых компонентах и шаблонах catalog.section есть не документированный и не выводимый параметр: "Скрывать описание раз...