24.01.14, 18:44
2 комментарий
  DLE Модули

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(


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

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 by Sander


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

Автор: Sander

Реклама

Комментарии

  1. nokia 4 марта 2014 04:13                    

    как называется картинка звездочек в этих кодах

  1. ToNik Пользователь offline 4 марта 2014 09:35                    

    nokia,
    А в коде не видно?
    b_rating.png

Напишите своё мнение

  • acuteaggressiveair_kissangel
    badbbbeachbeee
    biggrinbig_bossblumblush
    boastbombboredombye
    clappingcraycrazycurtsey
    dancedashdeclarediablo
    diroldon-t_mentiondownloaddrinks
    first_moveflirtfocusfool
    friendsgive_heartgive_rosegood
    hangheartheathelp
    hihunterhystericireful
    kingkisslaughlazy
    lolmail1mambaman_in_love
    mdamega_shokmoilmosking
    musicneanegativenew_russian
    okon_the_quietpardonparting
    partypilotpioneerpleasantry
    popcormpranksterprevedpunish
    roflrtfmrussiansad
    sarcasticscarescratchsearch
    secretsensoredshokshout
    slowsmilesmokesoldier
    soldier_girlsorryspitefulspruce_up
    stinkersuicidesunsuperstition
    swoonteasetenderthanks
    thisto_pick_ones_noseto_take_umbragetreaten
    umnikunknwvampirevava
    victorywackowhistlewink
    wizardyahooyesyu
    e101e102e103e104
    e105e106e107e108
    e109e110e111e112
    e113e114e115e116
    e117e118e119e120
    e121e122e123e124
    e125e126e127e128
    e129e130e131e132
    e133e134e135e136
    e137e138e139e140
    e141e142e143e144
    e145e146e147e148
    e149e150e151e152
    e153e154e155e156
    e157e158e159e160
    e161e162e163e164
    e165e166e167e168
    e169e170e171e172
    e173e174e175e176
    e177e178e179e180
    e181e182e183e184
    e185e186e187e188
    e189e190e191e192
    e193e194e195e196
    e197e198e199e200
    e201e202e203e204