Задать вопрос

Почему на обновляет пользовательское свойство Битрикс?

Есть кнопка
<button class="catalog__like btn shadow-none w-auto bg-transparent favorites" role="button" data-item="319"></button>


при нажатии ее оправляем данные data-item обработчику

Array.from(document.getElementsByClassName('catalog__like')).forEach((button) => {
                button.addEventListener('click', (e) => {
                    e.preventDefault();
                    console.log(e.target.getAttribute('data-item'));
                    let doAction = 'add';
                    addFavorite(e.target.getAttribute('data-item'), doAction);
                })
            });

            function addFavorite(id, action) {
                BX.ajax({
                    url: '<?=\CUtil::jsEscape(SITE_TEMPLATE_PATH)?>/ajax/favorities.php',
                    method: 'POST',
                    data: {"id": id, "action": action},
                    dataType: 'json',
                    async: true,
                    onsuccess: function (response) { 
                        if (result == 1) { 
                            console.log('ok')
                        }
                        if (result == 2) {
                            console.log('no')
                        }
                    },
                    onfailure: BX.delegate(function (response) {
                       
                    }, this),
                    error: function (jqXHR, textStatus, errorThrown) { // Если ошибка, то выкладываем печаль в консоль
                        console.log('Error: ' + errorThrown);
                        console.log(this.data)
                    }
                });

            }


обработчик

<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
//header('Content-Type: application/json');
$GLOBALS['APPLICATION']->RestartBuffer();

use Bitrix\Main\Application;
use Bitrix\Main\Web\Cookie;

$application = Application::getInstance();
$context = $application->getContext();
global $APPLICATION;

$request = \Bitrix\Main\HttpApplication::getInstance()->getContext()->getRequest();

if ($request->isPost() && isset($request['id']) && isset($request['action'])) {
    $idUser = $USER->GetID();
    $rsUser = CUser::GetByID($idUser);
    $arUser = $rsUser->Fetch();
    $arElements = $arUser['UF_FAVORITES'];  // Достаём избранное пользователя

    $arElements[] = $request['id'];
    $USER->Update($idUser, array("UF_FAVORITES" => $arElements)); // Добавляем элемент в избранное
    $result = 1;
    echo json_encode($result);
}

?>


в ответ прилетает что все ок (возвращает 1), но данные не обновляет

в консоли летит

BX.debug:
(3) ['processing', ReferenceError: result is not defined
at Object.onsuccess (https://..............., {…}]
debug.js:41 console.trace
debug @ debug.js:41
emit @ event-emitter.js:537
onCustomEvent @ core-compatibility.js:324
BX.ajax.processRequestData @ core_ajax.js:500
BX.ajax.__run @ core_ajax.js:390
config.xhr.onreadystatechange @ core_ajax.js:228
XMLHttpRequest.send (async)
BX.ajax @ core_ajax.js:261
addFavorite @ ?clear_cache=Y:1825
(anonymous) @ ?clear_cache=Y:1819


что не так? чего ругается?

решение.
поправил ответ, сделал его JSON
ответ
if (!in_array($request['id'], $arElements)) // Если еще нету этой позиции в избранном
    {
        $arElements[] = $request['id'];
        //$result = 1;
        $result = array("ID" => $request['id'], "RESULT" => 'ADD' );

    } else {
        $key = array_search($request['id'], $arElements); 
        unset($arElements[$key]);
        $result = array("ID" => $request['id'], "RESULT" => 'DEL' );
    }
  • Вопрос задан
  • 378 просмотров
Подписаться 1 Средний 4 комментария
Решения вопроса 1
@kudis
Bitrix developer
ответ `1` - это не json, а вы просите dataType: 'json', поэтому BX ругается в консоли
записать массив можно только в multiple(множественное) поле
и, конечно же, нужно проверить нет ли этого id уже в избранном
if (!in_array($arElements, $request->getPost('id'))) {
    $arElements[] = $request->getPost('id');
    $USER->Update($idUser, ['UF_FAVORITES' => $arElements]);    
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
scottparker
@scottparker
в ошибке написано, что result не определён (перевод). оло, что за result в обработке ответа?
result == 1) {
   console.log('ok')
}
if (result == 2) {
   console.log('no')
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы