Супербыстрый хостинг на SSD от 115р в месяц   •   Реклама
5 199 просм
37 комм
Поделиться:

Улучшаем рейтинг материалов DLE + выводим общую оценку в нужном месте

Для тех, кто не знал, мы недавно обновили наши онлайн инструменты. Сделали их более удобными и функциональными. Но сейчас речь идет не об этом. В процессе реализации мы столкнулись с некоторыми проблемами, а именно:

1. Стандартный рейтинг звездами в DLE показался нам не совсем точным;
2. Нам потребовалось вывести числом общую оценку рейтинга в нужном нам месте.

Первую мы смогли обнаружить с помощью второй проблемы, когда вывели число рейтинга, который показывал нам оценку 4.7, в то время, как звезды показывали нам показатель в 4.5. Решить обе проблемы нам удалось, и сейчас мы расскажем вам, как мы это сделали.

Повышаем точность рейтинга

Для того чтобы сделать ваш рейтинг более точным, выполним следующее:

Открываем файл functions.php в папке /engine/modules/, на 281 строке находим:

if( $rating AND $vote_num ) $rating = round( ($rating / $vote_num), 0 );
else $rating = 0;
if ($rating < 0 ) $rating = 0;
$rating = $rating * 20;

И заменяем все на:

if($rating AND $vote_num) {

	$rating = round(($rating / $vote_num), 1);
	
} else {

	$rating = 0;
	
}

if($rating < 0) {

	$rating = 0;
	
}

$rating = floor($rating * 20);

Вот такими манипуляциями мы сделали наш рейтинг более точным.

Выводим общую оценку рейтинга

Для того чтобы вывести в нужном месте общую оценку рейтинга числом, делаем следующее:

1. Открываем файлы show.full.php в папке /engine/modules/ находим строчку:

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );

и после нее вставляем:

$tpl->set('{rating_nums}', str_replace(",", ".", round($row['rating'] / max(1, $row['vote_num']), 1)));

Сохраняем и отправляем файл обратно на сайт.

2. Далее, открываем файл show.short.php в папке /engine/modules/ находим строчку:

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 1 ) );

и после нее вставляем:

$tpl->set('{rating_nums}', str_replace(",", ".", round($row['rating'] / max(1, $row['vote_num']), 1)));

Сохраняем и отправляем файл обратно на сайт.

3. Действия из шага 2 вы в точности повторяете уже с файлом show.custom.php, который также находится в папке /engine/modules/.

На сайте, в нужном вам месте используйте тег {rating_nums} для вывода общей оценки

Важное замечание, «1» здесь – это сколько должно выводиться знаков после запятой, то есть рейтинг будет в виде 4.7, если вы измените «1» на «2», то будет, например, 4.67.

Ну вот вроде и все, мы с вами сделали небольшой апгрейд стандартного рейтинга DLE, тем самым повысив точность показателей и сделали возможность вывести оценку рейтинга числом в нужном месте.

Если у вас остались вопросы – задавайте их в комментариях.

37
комментариев
Гостям запрещено участвовать в обсуждениях сайта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.

Артем Мáлков, простите делитанта,я решил проблему. Не углядел то,что был отключён пункт выставление рейтинга в краткой новости.все работает,спасибо за помощь

  • 0

Артем Мáлков, так я продублировал,но это результатов не дало

  • 0

Павел Лукашенко, в таком случае, код из статьи необходимо продублировать в файлы show.custom.php и show.short.php

  • 0

Помогите пожалуйста сделала всё как по инструкции но всё равно рейтинг не выходит через custom (dle13.2)

  • 0

Сделал все по инструкции,в полной новости оценка выходит а в короткой через custom только текстом {rating_num} (dle 13.2)

  • 0

Артём Ройзман, в таком случае, часть строки:

round($row['rating'] / max(1, $row['vote_num']), 1)

замените на:

number_format($row['rating'] / max(1, $row['vote_num']), 1)

  • 0

Кстати, всегда было интересно, как реализовать такую же вставку смайлов в комментариях как у вас? Т.е при наведении на смайл, открывается окошечко и можно выбрать смайл.

  • 0

Здравствуйте Артём. А как сделать вывод числа в виде 5.0? А не просто 5.

Это к текущему хаку необходимо.

  • 0
14.07 в 19:39

Артем Малков, спасибо, я просто забыл отредактировать show.custom.php. Подскажите, можно ли сделать так, чтобы цифра рейтинга обновлялась без перезагрузки страницы вместе со звездами?

  • 10

Lock, если не ошибаюсь - этот файл тут не учавствует. Покажите сайт где повторяется проблема, постараюсь помочь.

  • 1
7.07 в 16:54

upd. версия 13.0

  • 0
7.07 в 16:53

Здравствуйте, почти аналогичная проблема как у пользователя сверху, из-за фильтра по доп. полям, работающего на ajax, слетает рейтинг, вместо цифры показывает {rating_nums}, после перезагрузки страницы все встает на место. Как я понял, нужно править /engine/ajax/rating.php, но ума не приложу. Помогите, пожалуйста.

  • 0

Дмитрий, для этого можно написать небольшой модуль. Возможно, реализуем это.

  • 0
26.06 в 09:56

Вопрос не совсем по теме. Общая оценка анонимна. Как можно реализовать отображение оценки выставленной конкретным пользователем? Например в комментарии оценка новости выставленная пользователем и сам комментарий.

  • 0
15.06 в 10:16

Артем, а как заставить custom сортировать новости именно по {rating_nums} теперь? Так как стандартная сортировка не совсем точная, ведь новость к примеру с оценкой 11 где 11 человек поставят оценку 1, будет стоять выше чем новость за которую 1 человек поставит 10. Не разобрался просто еще в каком месте редактировать саму сортировку новостей чтобы применить это решение. Как мне кажется, раз по рейтингу новости сортировка - то нужно сортировать по оценке, а не количеству накликаного рейтинга. Ведь может людям именно не нравиться новость, смысл ее тогда в топ выводить на первые места. confuse

  • 0

Антон, всего скорее вам нужно изменить код отвечающий за ajax. Смотрите в сторону файла /engine/ajax/rating.php

  • 8
9.04 в 19:54

Здравствуйте.

Совместил 2 хака рейтинга, ваш и Sander (Bars-Rating by Sander)...

В итоге получил вывод рейтинга один в один как на плей маркете...

И общее значение выводится цифрой, и прогрессбар на каждую оценку...

И вроде все работает на ура, но...

При добавления рейтинга пользователем и аякс обновления рейтинга вместо значения вылетает тег "{rating_nums}"...

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

Вот, как бы это все победить?

  • 0
22.11 в 20:27

Спасибо помогло.

  • 0

fox, Здравствуйте! Строку:

$tpl->set('{rating_nums}', str_replace(",", ".", round($row['rating'] / max(1,$row['vote_num']),1)));

замените на:

$tpl->set('{rating_nums}', number_format($row['rating'] / max(1, $row['vote_num']), 1, '.', ''));

Должно помочь.

  • 8
21.11 в 21:20

Здравствуйте!

Спасибо за хак, все работает.

А как сделать так, чтобы выводилось число не 5, а 5.0 или 4.0.

  • 0

Epictrium, Андрей? nerd

  • 6
13.10 в 12:27

Проблема решена мною. Андрей, вы забыли упомянуть о том, что в show.custom.php тоже нужно добавлять эту строчку:

$tpl->set('{rating_nums}', str_replace(",", ".", round($row['rating'] / max(1,$row['vote_num']),1)));

  • 2

Epictrium, Какая версия движка?

  • 11
11.10 в 01:56

Ровным счетом - ничего. Сделал все как Вы сказали:

1) Добавил две строчки;

2) Очистил кэш сайта.

И проблема как была, так и осталась =(

  • 0

Epictrium, А после того, как вы сделали правки из предыдущего моего комментария - что у вас произошло?

  • 10
11.10 в 00:47

Увы, не помогло.

Попробую разъяснить ситуацию более подробно:

1) Следовал инструкциям этого поста. Все сделал, новый тег вроде работает (думал я);

2) Вставлял {rating_nums} в шаблоны: shortstory.tpl, fullstory.tpl, relatednews.tpl (дублирует файл "shortstory.tpl", а также используется в качестве шаблона для тега "{custom}". Пример - "{custom ... template="relatednews" ... }");

3) Там, где шаблон используется по дефолту при помощи тега "{content}" (этот тег по-умолчанию использует шаблон "shortstory.tpl"), все работает на ура! Тег "{rating_nums}" работает, тем самым показывая число. На странице полной новости тоже все окей! ОДНАКО, возникает ситуация, в которой тэг "{custom}", выводя новости и опираясь на шаблон "relatednews.tpl" (НАПОМИНАЮ о том, что "{custom ... template="relatednews" ... }") показывает не ЧИСЛО, а ТЕКСТ, который содержит лишь название тега {rating_nums}.

Я надеюсь, ситуация Вам теперь ясна во всех красках!) Я развожу руками, будучи чайником в php..

А что думаете Вы по этому поводу, Артем? nerd

  • 1

Epictrium, если я правильно понял о чем речь, то:

1. Откройте файл main.php в папке /engine/modules/, и найдите в нем строку содержащую:

if (stripos ( $tpl->copy_template, "{custom" ) !== false) {

Выше нее вставьте:

$row_num_rate = $row['vote_num'];

$tpl->set( '{vote_nums}', $row_num_rate );

Сохраните изменения и отправьте файл обратно на сайт + очистите кэш сайта если он используется.

Если все получилось - отпишитесь в комментариях.

  • 6
10.10 в 21:44

Все работает на ура!

Однако есть одно НО - в теге {custom} новый тег {rating_nums} отображается как {rating_nums}, а не как число.

А вот в теге {content} новый тег отображается корректно.

Очень неприятная проблема. Прошу Вашей помощи, Артем =)

  • 1
12.09 в 21:36

спасибо! так все без ошибок работает...

  • 0

Serg, всего скорее у вас там такие строки:

if( $config['short_rating'] and $user_group[$member_id['user_group']]['allow_rating'] ) $tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 1 ) );

else $tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 0 ) );

Замените их на:

if($config['short_rating'] and $user_group[$member_id['user_group']]['allow_rating'] ) {

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 1 ) );

} else {

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 0 ) );

}

И дальше, сделайте все как написано в инструкции - ошибок быть не должно

  • 10
11.09 в 17:22

на дле10 оно так не работает( при наличии данной строки - ошибка... Работает только если убрать ту строку...а иначе ругается на "unexpected else" в 298 строке...

А та строка которую я убрал критична или можно и без нее?

  • 0

Serg, спасибо за замечание! Поправили статью. wink

  • 6
10.09 в 12:35

Здравствуйте, вопрос можно? Относительно "Выводим общую оценку рейтинга" - у меня строка которую надо заменить немного отличается, Она вот такая

if( $config['short_rating'] and $user_group[$member_id['user_group']]['allow_rating'] )

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], 1 ) );

Методом "тыка" я выяснил что если убрать вторую строку и добавить ваш код, то все работает (иначе - движок падает), но терзают смутные сомненья, не отключил ли я что-то нужное и не вылезет ли мне это боком потом?)

  • 1

Gh8st, всегда пожалуйста. А с микроразметкой рейтинга вы можете ознакомиться здесь - https://www.pandoge.com/stati_i_sovety/mikrorazmetkareytinga-polnoy-novosti-v-dle

  • 7
3.03 в 14:05

Спасибо за отличный хак :) Так же интересует микроразметка рейтинга.

  • 1
29.11 в 15:13

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

  • 2
29.11 в 15:11

Кстати про рейтинг. была б очень полезной статья про микроразметку рейтинга да и вообще всего сайта на dle. Находил много полезностей на эту тему у Алаичъа но там старая инфа, не рискнул применять к своим сайтам.

  • 3
Подняться наверх
«Pandoge» - помощник веб-мастера