Артём Мáлков

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

25 ноя63 комм

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

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

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

Рекомендуем к просмотру
10-балльная оценка в отзыве о товаре в OpenCart
Хаки
Микроразметка второго и третьего типа рейтинга полной новости в DLE
Посты
Рейтинг материалов в пять звезд на uCoz
Статьи и советы
63
комментария
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    6
      •  Пользователь
    17 апр в 17:22

    Артём Мáлков

    напишите пожалуйста для Dle 14.0 как сделать, код отличается, если можно плагин прикрепите пожалуйста.

    • 1
    2
      •  Проверенный
    13 фев в 15:59

    А для 14 версии тег {rating_num} будет работать?

    • 1
    2
      •  Проверенный
    8 янв в 12:58

    Версия 13.3 значение рейтинга отображается только для полной новости, а для кратких и custom выводится просто {rating_nums}

      • 1
      1066
        •  Команда Pandoge
      8 янв в 15:15

      Дмитрий, 2 и 3 шаги точно сделали? Кеш сайта очистили по завершению?

      • 1
      3
        •  Проверенный
      30 янв в 15:32

      Артём Мáлков,

      подскажи как вывести общую оценку рейтинга для dle 13.0 первого типа рейтинга 'Оценка'.

      выводит только текстом {rating_num}

      • 1
      1066
        •  Команда Pandoge
      30 янв в 19:12

      Александр, Здравствуйте!

      То есть вместо оценки просто выводится тег {rating_num}?

      • 1
      3
        •  Проверенный
      5 фев в 20:54

      Артём Мáлков, да и всё, что не так ?

    • 2
    1066
      •  Команда Pandoge
    23 дек в 19:48

    Артём Ройзман, нет, не была.

    • 1
    26
      •  Проверенный
    23 дек в 16:17

    Артём Мáлков, это действительно помогло. Можно уточнить, вам такая правка по дефолту не была необходима на 13.2 или 13.3?

    • 1
    1066
      •  Команда Pandoge
    23 дек в 16:12

    Артём Ройзман, Вы немного путаете наверно. Хлебные крошки не имеют рейтинга, а вот новости - да.

    В таком случае, откройте файл functions.php в папке /engine/modules/.

    В нем найдите строку:

    $shema = "<meta itemprop=\"itemReviewed\" content=\"{$shema_ratig_title}\"><meta itemprop=\"worstRating\" content=\"1\"><meta itemprop=\"ratingCount\" content=\"{$vote_num}\"><meta itemprop=\"ratingValue\" content=\"{$shema_ratig}\"><meta itemprop=\"bestRating\" content=\"5\">";

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

    $shema_ratig = str_replace(",", ".", $shema_ratig);

    Это должно решить Вашу проблему.

    • 1
    26
      •  Проверенный
    23 дек в 15:51

    Артём Мáлков, да, хлебные крошки стандартные.

    • 1
    1066
      •  Команда Pandoge
    23 дек в 15:49

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

    • 1
    26
      •  Проверенный
    23 дек в 14:50

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

    В {rating_nums} - выводится точка

    А в хлебных крошках, а именно в теге <meta itemprop="ratingValue" content="4,7"> запятая

    • 1
    1066
      •  Команда Pandoge
    23 дек в 01:00

    Артём Ройзман, проверил.

    Все о.к, как и описано в статье.

    • 1
    26
      •  Проверенный
    22 дек в 13:43

    Можете проверить у себя, работает ли всё верно на 13.2 - 13.3? Проверил всё дважды не work

    • 1
    26
      •  Проверенный
    21 дек в 15:55

    Артём Мáлков, всё именно делал как в инструкции. DLE 13.3

    • 1
    1066
      •  Команда Pandoge
    21 дек в 15:40

    Артём Ройзман, если Вы используете код из статьи, то запятая уже должна заменяться:

    str_replace(",", ".", 
    • 1
    26
      •  Проверенный
    21 дек в 11:26

    Артём Мáлков, Хотел спросить по поводу вывода в разметке.

    Сейчас выводится в таком виде - <meta itemprop="ratingValue" content="3,7"> - (разделитель - запятая)

    Как заменить на точку?

    • 1
    26
      •  Проверенный
    30 ноя в 21:42

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

    • 2
    1066
      •  Команда Pandoge
    16 ноя в 05:07

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

    • 1
    26
      •  Проверенный
    15 ноя в 16:59

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

    • 1
    1066
      •  Команда Pandoge
    15 ноя в 16:56

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

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

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

    • 1
    26
      •  Проверенный
    15 ноя в 02:13

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

    • 1
    1066
      •  Команда Pandoge
    5 ноя в 15:43

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

    • 3
    1
      •  Пользователь
    5 ноя в 14:27

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

    • 2
    15
      •  Проверенный
    21 авг в 16:19

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

    • 1
    15
      •  Проверенный
    21 авг в 15:44

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

    • 1
    1066
      •  Команда Pandoge
    21 авг в 13:55

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

    • 1
    15
      •  Проверенный
    21 авг в 08:21

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

    • 1
    15
      •  Проверенный
    21 авг в 08:18

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

    • 1
    1066
      •  Команда Pandoge
    23 апр в 03:25

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

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

    замените на:

    number_format($row['rating'] / max(1, $row['vote_num']), 1)
    • 1
    26
      •  Проверенный
    23 апр в 02:44

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

    • 2
    26
      •  Проверенный
    23 апр в 02:25

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

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

    • 11
    766
      •  Гости
    14 июл в 19:39

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

    • 2
    1066
      •  Команда Pandoge
    8 июл в 17:39

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

    • 1
    766
      •  Гости
    7 июл в 16:54

    upd. версия 13.0

    • 1
    766
      •  Гости
    7 июл в 16:53

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

    • 1
    1066
      •  Команда Pandoge
    30 июн в 23:41

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

    • 1
    766
      •  Гости
    26 июн в 09:56

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

    • 1
    766
      •  Гости
    15 июн в 10:16

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

    • 9
    1066
      •  Команда Pandoge
    10 апр в 18:05

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

    • 1
    766
      •  Гости
    9 апр в 19:54

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

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

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

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

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

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

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

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

    • 1
    766
      •  Гости
    22 ноя в 20:27

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

    • 9
    1066
      •  Команда Pandoge
    21 ноя в 21:52

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

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

    • 1
    766
      •  Гости
    21 ноя в 21:20

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

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

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

    • 7
    1066
      •  Команда Pandoge
    13 окт в 19:07

    Epictrium, Андрей? nerd

    • 3
    766
      •  Гости
    13 окт в 12:27

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

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

    • 12
    1066
      •  Команда Pandoge
    11 окт в 02:00

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

    • 1
    766
      •  Гости
    11 окт в 01:56

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

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

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

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

    • 11
    1066
      •  Команда Pandoge
    11 окт в 01:41

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

    • 2
    766
      •  Гости
    11 окт в 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

    • 7
    1066
      •  Команда Pandoge
    10 окт в 23:04

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

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

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

    • 3
    766
      •  Гости
    10 окт в 21:44

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

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

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

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

    • 1
    766
      •  Гости
    12 сен в 21:36

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

    • 11
    1066
      •  Команда Pandoge
    11 сен в 19:54

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

    }

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

    • 1
    766
      •  Гости
    11 сен в 17:22

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

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

    • 7
    1066
      •  Команда Pandoge
    10 сен в 15:10

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

    • 2
    766
      •  Гости
    10 сен в 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 ) );

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

    • 8
    1066
      •  Команда Pandoge
    3 мар в 21:13

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

    • 2
    766
      •  Гости
    3 мар в 14:05

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

    • 3
    766
      •  Гости
    29 ноя в 15:13

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

    • 4
    766
      •  Гости
    29 ноя в 15:11

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

      • 1
      4
        •  Пользователь
      3 дек в 19:15

      На DLE 13.3 не работает. В файле functions.php между кодом:

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

      и кодом:

      $rating = $rating * 20;

      стоит вот такой код:

      if ($vote_num AND $dle_module == "showfull") {
      			
      			$shema_title = "  itemscope itemtype=\"http://schema.org/Rating\"";
      			$shema_ratig = $rating;
      			$shema_ratig_title = str_replace("&amp;", "&",  htmlspecialchars( strip_tags( stripslashes( $row['title'] ) ), ENT_QUOTES, $config['charset'] ) );
      			$shema = "<meta itemprop=\"name\" content=\"{$shema_ratig_title}\"><meta itemprop=\"worstRating\" content=\"1\"><!-- <meta itemprop=\"ratingCount\" content=\"{$vote_num}\">--><meta itemprop=\"ratingValue\" content=\"{$shema_ratig}\"><meta itemprop=\"bestRating\" content=\"5\">";
      
      		} else {
      			$shema_title = "";
      			$shema = "";
      		}

      И куда ставить код:

      if($rating AND $vote_num) {
      
      $rating = round(($rating / $vote_num), 1);
      	} else {
      $rating = 0;
      	}
      if($rating < 0) {
      $rating = 0;
      	}
      $rating = floor($rating * 20);
      ?

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