» » » Bars-Rating [DLE 9.7 - 10.1]

Ошибка добавление новости
Вы зашли на сайт как незарегистрированный пользователь.
Для добавления новости Вам требуется зарегистрироваться либо войти на сайт под своим именем.
Ошибка добавление вопроса
Вы зашли на сайт как незарегистрированный пользователь.
Для добавления вопроса Вам требуется зарегистрироваться либо войти на сайт под своим именем.

Bars-Rating [DLE 9.7 - 10.1]

 Robot    2014.02.13    DLE хаки     1084 
Bars-Rating [DLE 9.7 - 10.1]


Название: Bars-Rating
Автор: Sander
CMS: DLE 9.7 - 10.1

Описание:
От автора:
Много скриншотов делать не стал, все что надо - видно на обложке.
В подробном описании, я считаю, он так же не нуждается. Разве что стоит отдельно отметить тот факт, что значения стандартного рейтинга сохраняются и с помощью "умного" алгоритма автоматический вычисляются количества оценок от 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(


и ПЕРЕД ней вставить:
function b_sander_rating($id,$rate,$vote){
	global $db;
	if(!$vote) return "0|0|0|0|0";
	$vt = array_fill(0,$vote,1);
	if(($rate-$vote)>=5) $vt[0] = 5;
	$vt[$vote-1] = 1;
	$i = 0;
	$r = 0;
	while($r<$rate){
		$i++;
		if($i>10000) return "0|0|0|0|0";
		if($r<$rate){
			shuffle($vt);
			foreach($vt as $k=>$v){
				if($v<5){
					$vt[$k] = $v+1;
					break;
				}
			}
		}
		$r = 0;
		foreach($vt as $v) $r += $v;
	}
	$votes = array_fill(1,5,0);
	foreach($vt as $v) $votes[$v] = $votes[$v]+1;

	$votes = implode("|",$votes);
	$db->query("UPDATE ".PREFIX."_post SET b_rating='{$votes}' WHERE id={$id}");
	return $votes;
}

function ShowRating($id, $rating, $vote_num, $allow = true){
	global $row;
	if(!$row['b_rating']) $row['b_rating'] = b_sander_rating($id,$rating,$vote_num);
	$b_rating = explode("|",$row['b_rating']);
	$max = max($b_rating);
	if($vote_num) $rateval = round($rating/$vote_num);
	else $rateval = 0;
	$list = '';
	$pc = array();
	for($i=4;$i>=0;$i--){
		$k = $i+1;
		$w = ceil(100*$b_rating[$i]/$max);
		if($rateval>=$k) $pc[$k] = "class='b-current'";
		$list .= "\t<li><div class=\"b-rating-lines-rate\">{$k}</div><div class=\"b-rating-lines-bar b-color-{$k}\" style=\"width:{$w}%\"></div><div class=\"b-rating-lines-votes\">{$b_rating[$i]}</div></li>\n";
	}

return <<<HTML
<!-- Bar-Rating by sandev.pro -->
<div class="b-rating-area" id='ratig-layer-{$id}'>
	<ul class="b-rating-lines">
		{$list}
	</ul>
	<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>

HTML;
}


Открыть файл 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 [DLE 9.7 - 10.1]


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

Надеюсь, что модуль будет полезным и кому-нибудь пригодится :)
Другие новости по теме:
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Гости
That's really thnkniig out of the box. Thanks!


5 мая 2015 07:24
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.