Быстрый и надёжный хостинг на SSD-дисках от 165р в месяц   •   Реклама
5 635 просм
44 комм
Поделиться:

Улучшаем рейтинг материалов 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, тем самым повысив точность показателей и сделали возможность вывести оценку рейтинга числом в нужном месте.

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

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

Артём Мáлков, отлично. Кстати к свежей версии DLE не подойдут правки

30 ноя в 21:42
  • 0
Администратор758

Артём Ройзман, хм, подумаю на днях над этим.

16 ноя в 05:07
  • 1
Проверенный16

Артем Мáлков, ну вот к примеру ниже писали про проблемы с сортировкой по рейтингу.

15 ноя в 16:59
  • 0
Администратор758

Артём Ройзман, здравствуйте.

Почему "ваша реализация к сожалению не будет работать так как это работает по дефолту"?

Я использую эти наработки на нескольких сайтах и проблем там никаких не увидел.

15 ноя в 16:56
  • 0
Проверенный16

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

15 ноя в 02:13
  • 0
Администратор758

Сергей Блок, кеш сайта пробовали чистить? А так, проблем не должно быть.

5 ноя в 15:43
  • 0
Пользователь1

Здравствуйте. Большое спасибо за хак, но возникла проблема. Установил его через систему плагинов версия DLE 13.3, все работает кроме быстрого поиска, каким макаром он его затрагивает, но как только отключаю плагин данный, поиск снова работает, включаю выдает такую ошибку:

Fatal error: Cannot redeclare dle_session() (previously declared in \engine\cache\system\plugins\e971c25031b1e4f4cfe984c7951c7d6f.php:51) in \engine\modules\functions.php on line 66

5 ноя в 14:27
  • 2
Проверенный7

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

21 авг в 16:19
  • 1
Проверенный7

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

21 авг в 15:44
  • 0
Администратор758

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

21 авг в 13:55
  • 0
Проверенный7

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

21 авг в 08:21
  • 0
Проверенный7

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

21 авг в 08:18
  • 0
Администратор758

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

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

замените на:

number_format($row['rating'] / max(1, $row['vote_num']), 1)
23 апр в 03:25
  • 0
Проверенный16

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

23 апр в 02:44
  • 0
Проверенный16

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

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

23 апр в 02:25
  • 0
Гости679

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

14 июл в 19:39
  • 10
Администратор758

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

8 июл в 17:39
  • 1
Гости679

upd. версия 13.0

7 июл в 16:54
  • 0
Гости679

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

7 июл в 16:53
  • 0
Администратор758

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

30 июн в 23:41
  • 0
Гости679

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

26 июн в 09:56
  • 0
Гости679

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

15 июн в 10:16
  • 0
Администратор758

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

10 апр в 18:05
  • 8
Гости679

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

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

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

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

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

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

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

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

9 апр в 19:54
  • 0
Гости679

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

22 ноя в 20:27
  • 0
Администратор758

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, '.', ''));

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

21 ноя в 21:52
  • 8
Гости679

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

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

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

21 ноя в 21:20
  • 0
Администратор758

Epictrium, Андрей? nerd

13 окт в 19:07
  • 6
Гости679

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

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

13 окт в 12:27
  • 2
Администратор758

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

11 окт в 02:00
  • 11
Гости679

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

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

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

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

11 окт в 01:56
  • 0
Администратор758

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

11 окт в 01:41
  • 10
Гости679

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

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

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

11 окт в 00:47
  • 1
Администратор758

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 );

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

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

10 окт в 23:04
  • 6
Гости679

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

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

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

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

10 окт в 21:44
  • 1
Гости679

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

12 сен в 21:36
  • 0
Администратор758

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 ) );

}

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

11 сен в 19:54
  • 10
Гости679

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

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

11 сен в 17:22
  • 0
Администратор758

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

10 сен в 15:10
  • 6
Гости679

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

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 ) );

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

10 сен в 12:35
  • 1
Администратор758

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

3 мар в 21:13
  • 7
Гости679

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

3 мар в 14:05
  • 1
Гости679

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

29 ноя в 15:13
  • 2
Гости679

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

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