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

Скрипт с ajax меняет стили только после перезагрузки страницы?

Здравствуйте. Нужно реализовать на сайте интернет-магазина на битрикс "Избранные товары".
Нашел в интернете решение, которое работает, но не полностью.

Суть такова: создаем php файл с кодом:
<?
global $USER;
if (CModule::IncludeModule ( "iblock" )) {
    $elId = intval ( $_REQUEST ["elid"] );
    $userId = $USER->GetID (); 
    $dbEl = CIBlockElement::GetList ( Array (), Array ("ID" => $elId, "IBLOCK_ID" => "2" ) );

    if ($obEl = $dbEl->GetNextElement () AND !empty($userId)) {
        $props = $obEl->GetProperties ();
        $UserList = array_unique($props["F_USER"]["VALUE"]); 
            if(!in_array($userId, $UserList)) {
                $UserList[] = $userId;
                CIBlockElement::SetPropertyValueCode ($elId, "F_USER", $UserList);
                echo "done";
            }
            else {
                $key = array_search($userId, $UserList);
                unset($UserList[$key]);
                CIBlockElement::SetPropertyValueCode ($elId, "F_USER", $UserList);
                echo "deleted";
            }
    }
    else {
        echo "fail";
    }
}
exit;?>


В компоненте bitrix.section в месте, где нужна ссылка такой код:
<?if(in_array($USER->GetId(),$arItem["PROPERTIES"]["F_USER"]["VALUE"])){
	$check = " checked";
}
else{
	$check = "";
};?>
<a href="#" class="catalog-item-fav favorite_check<?=$check?>" data-id="<?=$arItem['ID']?>"></a>
	<div class="favorit_label"> <?=$val?></div>


Все это обрабатывается скриптом с ajax функцией:
<script>
$("document").ready(function(){
	$(".favorite_check").click(function(e){
		e.preventDefault();
		var $this = $(this);
			$.get("/personal/favoriteajax.php", {
				elid: $this.data('id')
			}, function(data){
				switch(data){
					case 'done' : var response = 'Товар успешно добавлен в избранное';$this.addClass("checked");break;
					case 'deleted' : var response = 'Товар успешно удален из избранного';$this.removeClass("checked");break;
					case 'fail' : var response = 'Вы не авторизованы, либо Ваш запрос некорректен';$this.removeClass("checked");break;
				}
$(".favorit_label").html(response).fadeIn().delay(2000).fadeOut();
			});
		});
});
</script>


Свойство F_USER создается в свойствах товаров и с ним все уже завязывается.

Что работает: скрипт при нажатии работает, т.е обращается к php документу. Товару задается свойство F_USER, т.е товар добавляется в избранное.

Что не работает: в скрипте есть функция добавления класса "checked" ссылке. Это нужно, чтобы на данный класс повесить нужные стили. Также есть функция вывода сообщения о том, что товар добавлен. Все это должно происходить одномоментно, без перезагрузки страницы - нажал на ссылку, она поменяла цвет и сообщение выскочило. У меня это не работает. Более того, класс добавляется только тогда, когда "сбрасываю кеш".

В чем может быть ошибка? Спасибо.
  • Вопрос задан
  • 589 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Coraelstraze Автор вопроса
Вопрос решил сам! в php файле не добавил перед кодом строку:

<? require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');?>

После добавления все заработало!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rema1ns
@Rema1ns
и так сойдет
bitrix.section - в кеше лежит, а у вас не происходит никакое событие, которые бы обновило кеш у компонента
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект
18 дек. 2024, в 11:57
500 руб./в час