Bars-Rating by Sander для DLE

Bars-Rating by Sander

Bars-Rating by Sander

Как и обещал, выкладываю на всеобщее обозрение данный рейтинг :)
Много скриншотов делать не стал, все что надо - видно на обложке.
В подробном описании, я считаю, он так же не нуждается. Разве что стоит отдельно отметить тот факт, что значения стандартного рейтинга сохраняются и с помощью "умного" алгоритма автоматический вычисляются количества оценок от 1 до 5 баллов на основании исходных данных.
Если вы не знали, DLE не запоминает какую именно оценку поставил каждый пользователь. Только общий рейтинг и количество голосов.

Что ж, перейдем к самому интересному - установка.
В подключенном к шаблону файле стилей прописать такие стили:
.b-rating-area{height:120px;width:270px;margin:10px 0;text-align:left;}
.b-rating-lines{list-style:none;margin:0;padding:0;}
	.b-rating-lines li{height:18px;display:block;font:normal 12px/17px Arial;color:#333;width:200px;padding:0 50px 0 20px;}
	.b-rating-lines li:hover{background:#fafafa;}
		.b-rating-lines-bar{float:left;height:16px;}
			.b-color-5{background:#7cac16;border-bottom:1px solid #699212;}
			.b-color-4{background:#a8d12e;border-bottom:1px solid #8fb127;}
			.b-color-3{background:#ffcf00;border-bottom:1px solid #d9b000;}
			.b-color-2{background:#faa732;border-bottom:1px solid #d48e2a;}
			.b-color-1{background:#d9534f;border-bottom:1px solid #b84643;}

		.b-rating-lines-rate{float:left;width:14px;height:100%;border-right:1px solid #444;margin-left:-15px;}
		.b-rating-lines-votes{float:right;width:40px;height:100%;margin-right:-50px;color:#666;}

.b-rating-vote-area{height:25px;padding-top:5px;font:normal 16px/25px Arial;color:#444;}
	.b-rating-stars{float:right;margin:0;padding:0;list-style:none;}
		.b-rating-stars li{float:left;width:25px;height:25px;background:url('../images/b_rating.png') no-repeat 0 0;cursor:pointer;}
		.b-rating-stars li.b-current{background-position:0 -25px;}
		.b-rating-stars li.b-hover{background-position:0 -50px;}


А так же в любой подключенный к шаблону JS файл вставить код:
$(document).on("mouseenter",".b-rating-stars li",function(){
	var b_index = $(this).index()+1;
	$(this).parent().find('li').each(function(i){
		if(b_index>i) $(this).addClass('b-hover');
	});
}).on("mouseleave",".b-rating-stars li",function(){
	$(this).parent().find('li').removeClass('b-hover');
});


Теперь самое интересное.
Выполнить запрос в БД:
ALTER TABLE `dle_post` ADD `b_rating` VARCHAR( 20 ) NOT NULL ;


Открыть файл engine/modules/functions.php
Найти строку:
function ShowRating(

В ней надо переименовать функцию, например так
function ShowRating2(

и ПЕРЕД ней вставить:


Открыть файл engine/ajax/rating.php
Найти строку:
	$db->query( "UPDATE " . PREFIX . "_post_extras SET rating=rating+'$go_rate', vote_num=vote_num+1 WHERE news_id ='$news_id'" );

После нее вставить:
	$r = $db->super_query("SELECT b_rating FROM ".PREFIX."_post WHERE id={$news_id}");
	if($r['b_rating']) $b_rating = explode("|",$r['b_rating']);
	else $b_rating = array_fill(0,5,0);
	$b_rating[$go_rate-1]++;
	$b_rating = implode("|",$b_rating);
	$db->query( "UPDATE " . PREFIX . "_post SET b_rating='$b_rating' WHERE id ='$news_id'" );


Найти строку:
$row = $db->super_query( "SELECT news_id, rating, vote_num FROM " . PREFIX . "_post_extras WHERE news_id ='$news_id'" );

Заменить на:
$row = $db->super_query( "SELECT e.news_id, e.rating, e.vote_num, p.b_rating FROM ".PREFIX."_post p LEFT JOIN " . PREFIX . "_post_extras e ON p.id=e.news_id WHERE news_id ='$news_id'" );


Картинку со звездочками залить в папку images в вашей папке с шаблоном.
Bars-Rating by Sander


Теперь что касается версии DLE. По большому счету пойдет даже на некроверсиях. Только на совсем старых надо будет еще и jQuery подключить (хотя он сейчас уже наверно во всех шаблонах подключен).
Инструкция писалась под версии DLE 9.7 - 10.1 (и старше). На младших будет отличаться только инструкция по установке.
НЕ надо просить меня написать инструкцию под некроверсии. Пора вам обновляться.

Надеюсь, что модуль будет полезным и кому-нибудь пригодится :)

С уважением,
Олег Александрович a.k.a. Sander
Комментарии: (11)
  1. foto
    Посетитель 24 января 2014 22:41 #
    Доброго времени суток! Олег, может подскажешь, как отделить таблицу шкалы проголосовавших от звездного рейтинга. Просто надо шкалу вывести внизу страницы полной новости, а звездный рейтинг (общий), как внизу так и вверху fullstory. Да и в короткой новости нужен только звездный рейтинг, без таблицы шкалы проголосовавших.
    Заранее благодарен!
    0
  2. foto
    Посетитель 4 февраля 2014 10:54 #
    Было бы прикольней, если бы например: наводишь на рейтинг, и вот эта таблица вылизала с результатами.
    0
    1. foto
      Администратор 4 февраля 2014 22:42 #
      jQuery вам в помощь.
      Такое вполне реально и без внесения изменений в php код.
      +1
  3. foto
    Посетитель 4 февраля 2014 22:26 #
    Разве что стоит отдельно отметить тот факт, что значения стандартного рейтинга сохраняются и с помощью "умного" алгоритма автоматический вычисляются количества оценок от 1 до 5 баллов на основании исходных данных.


    Алгоритм возомнил себя через чур умным и решил, что ему лучше знать, что какие оценки ставили пользователи, несмотря на то, что реально они этих оценок не ставили :)

    На основании исходных данных технически невозможно вычислить количество оценок от 1 до 5, которые ставили пользователи. При просмотре с разных компьютеров, количество разных оценок постоянно скачет.

    Было бы круто выпустить вторую версию модуля, где в БД будут записываться реальные данные, сколько и каких оценок было поставлено. Это возможно?
    0
    1. foto
      Администратор 4 февраля 2014 22:41 #
      Рейтинг будет работать только в полной новости.
      В короткой надо в engine.php в каждый запрос добавлять колонку b_rating.
      Иначе будет получатся описанная вами ситуация. Скрипт не будет видеть значения поля b_rating и будет считать, что эта новость ранее не была обработана и будет заново генерировать значения.

      Цитата: korew
      На основании исходных данных технически невозможно вычислить количество оценок от 1 до 5, которые ставили пользователи.

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

      Цитата: korew
      Было бы круто выпустить вторую версию модуля, где в БД будут записываться реальные данные, сколько и каких оценок было поставлено. Это возможно?

      Так и сделано в этой версии. Значения записываются, но выводятся только в полной новости.

      PS. Разве что у вас версия DLE 9.5 или ниже. Там и для полной новости надо в запросе прописать колонку b_rating.
      0
      1. foto
        Посетитель 5 февраля 2014 09:31 #
        Можно, пожалуйста, инструкцию что нужно сделать, чтобы в краткой новости работал рейтинг? Даже не в краткой, я через {custom} вывожу новость с рейтингом.

        Если не затруднит :) Спасибо.
        0
        1. foto
          VIP 8 ноября 2015 13:27 #
          Да! в custom почему-то не работает.
          Пробовал выводить с сортировкой по рейтингу, вот так.
          {custom template="custom" days="30" limit="52" order="rating" cache="no"}

          У всех новостей выводится одинаковый рейтинг. Хотя это не так.
          0
  4. foto
    VIP 26 октября 2016 18:42 #
    Скажите каким способом можно этот рейтинг накрутить одним пользователем или гостем? Что-то неадекватные числа выводятся к некоторым статьям. Может ip менять или ещё что нибудь, или его невозможно накрутить?
    0
    1. foto
      Администратор 27 октября 2016 18:16 #
      Этот модуль использует исходные значения стандартного рейтинга. Соответственно если есть накрутка, то это накрутка стандартного рейтнга.
      Отключите рейтинг для гостей и накручивать будет крайне проблематично.
      0
      1. foto
        VIP 27 октября 2016 18:52 #
        Попробовал отключить для гостей, рейтинг не выставляется, но появилась бесконечная аякс загрузка, после нажатия на рейтинг, в чём может быть проблема? Можно как-то убрать звёзды для гостей, а сам рейтинг оставить?
        0
  5. foto
    Гость 12 апреля 2018 16:43 #
    Здравствуйте!
    На 12 ой версии, после выставления рейтинга вместо значений вылетают теги {rate} и {vote-num}...
    После обновления странички все встает на место и с верными значениям.
    Подскажите, что я намудрил не так?

    Вот кусок html кода из functions.php:

    return <<<HTML
    <!-- Bar-Rating by sandev.pro -->
    <div id='ratig-layer-{$id}'>
    <div class="layer1">
    	<div class="BHMmbe" >
    	{rate}
    	</div>
    	<div class="LvvOW">
    <div class="b-rating-vote-area">
    		<ul class="b-rating-stars" data-id="{$id}">
    			<li {$pc[1]} title="ужасно" onclick="doRate('1', '{$id}'); return false;"></li>
    			<li {$pc[2]} title="плохо" onclick="doRate('2', '{$id}'); return false;"></li>
    			<li {$pc[3]} title="нормально" onclick="doRate('3', '{$id}'); return false;"></li>
    			<li {$pc[4]} title="хорошо" onclick="doRate('4', '{$id}'); return false;"></li>
    			<li {$pc[5]} title="отлично" onclick="doRate('5', '{$id}'); return false;"></li>
    		</ul>
    	</div>
    	</div>
    	
    	<span class="EymY4b">Всего: <i class="fa fa-user" aria-hidden="true"></i> <span class="O3QoBc hzfjkd"></span><span class="">{vote-num}</span></span></div>
    	</div>
    	<div class="layer2">
    	<ul class="b-rating-lines">
    		{$list}
    	</ul>
    	</div>
    </div>
    
    HTML;
    0
Добавить комментарий
  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2018.
При копировании, ссылка на источник обязательна.