Шаблоны для Datalife Engine

Купить платные адаптивные DLE шаблоны
по приятным ценам.

Тех. поддержка временно не работает
Telegram: @vugluskr2023
Техническая поддержка
Корзина 0
Адаптивные dle шаблоны   Советы и новости   Отображение своей оценки в рейтинге звезды в DLE

Отображение своей оценки в рейтинге звезды в DLE

Данный код сохраняет оценку, которую поставил пользователя в рейтинге звёзды и отображает её на странице для пользователя. Работает без вмешательства в файлы DLE, но есть нюансы.

- Сохраняется в память браузера, и если пользователь зайдёт с другого браузера, то он не увидит оценок.
- Если пользователь авторизован (если не авторизован, то все ок) и голосует за свою же добавленную новость, то DLE не даст этого сделать, но оценка поставится. Чтобы этого не было, нужно вмешиваться в стандартную js функция DLE, не хотелось этого делать, хотя и возможно. Все же это индикация для юзера, а не для админа.

То есть по-хорошему нужно делать это модулем, который бы записывал оценку в базу данных. А это быстрый вариант, вдруг кому пригодится.

В fullstory.tpl
[rating-type-1]
<div class="pagetop__rating-stars" data-id="{news-id}">{rating}</div>
<div class="pagetop__rating-myvalue">Ваша оценка: <span>-</span></div>
[/rating-type-1]


В ваш js файл
const ratingId = document.querySelector('.pagetop__rating-stars').dataset.id;

/* будем работать с id новости и только на внутренней странице */
if (ratingId) {

	let userRatings = JSON.parse(localStorage.getItem('userRatings')), 
	ratingMyValue = document.querySelector('.pagetop__rating-myvalue span'), 
	ratingValue;

	if (!userRatings) {
		/* если массив оценок не в памяти, то добавим в память пустой массив */
		userRatings = [];
		localStorage.setItem('userRatings',JSON.stringify(userRatings));
	} else {
		/* если массив оценок в памяти, проверим наличие новости и если есть то отображаем оценку */
		let isExists = userRatings.findIndex( (element) => element.id === ratingId );
		if (isExists != -1) {
			ratingMyValue.innerText = userRatings[isExists].value;
		};
	};
	
	/* клики по звездам */
	document.addEventListener('click',(e)=> {
		let star = e.target.closest('.unit-rating a');
		if (star) {
			ratingValue = star.innerText;
			userRatings = JSON.parse(localStorage.getItem('userRatings'));
			let isExists = userRatings.findIndex( (element) => element.id === ratingId );
			if (isExists != -1) {
				/* новость есть в памяти, обновим значение */
				userRatings[isExists].value = ratingValue;
			} else {
				/* новость не в памяти, добавим в память */
				userRatings.push({
					id: ratingId,
					value: ratingValue,
				});
			};
			/* в любом случае отобразим оценку */
			ratingMyValue.innerText = ratingValue;
			/* запоминаем  в память обратно */
			localStorage.setItem('userRatings',JSON.stringify(userRatings));
		};
	});

};
Написать отзыв
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent
У меня было пять яблок, два яблока я съел. Сколько у меня осталось яблок? Напиши буквой например десять
Информация
Сайт приостанавливает свою работу в период с 1 июня до 10 июля. В этот период приостановлена продажа шаблонов и работа технической поддержки.

Можно приобрести только шаблон Advance

Спасибо за понимание.
Понятно