На этот раз вопрос опять коснется двика DLE. Как Вы наверно уже заметили - после перехода нашего сайта на этот движок, на сайте стали появляться статьи, связанные с улучшением либо дополнением этого движка для более компактной работы с ним. На этот раз поговорим о модуле "topnews", известном многим пользователям DLE как модуль, выводящий самые рейтинговые статьи.
Думал вообще-то начать без встпуления, но...как же - пишу ведь я, а я без вступления не могу :)). Итак, модуль topnews. Что это вообще такое? Для тех, кто не знает - этот модуль входит в стандартную сборку DLE-движка, и присуттсвует практически во всех версия этой CMS. Подключается к сайту путем вставки в шаблон main.tpl в нужном месте тега {topnews}. После включения данного тега в шаблон, в том месте где Вы его ставили будут выводится самые популярные статьи, в виде списка.
Для более понятного уяснения материала давайте все рассматривать на практике. Откройте файл topnews.php, он находится в папке engine/modules. Там находим строчку:
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,10" );
Это самая нужная нам строчка, в которой мы можем производить необходимые настройки этого модуля. Начнем с простого - для того что увеличить количество выводимых новостей этим модулем нужно изменить в части кода
DESC LIMIT 0,10" );
цифру 10 поменяйте на нужную Вам - это и есть цифра, отвечающая за количество новостей в блоке topnews.
Далее, излагаю чисто свое мнение - изначально этот модуль работает неправильно, т.е. новости, которые он выводит, я считаю, что отбираются не по тем критериям. Изначально, модуль выбирает из базы новостей самые рейтинговые новости, т.е те новости, которой пользователи Вашего сайта проставили больше всего рейтинга в том малюсеньком блоке с 5-тибальной шкалой рейтинга. Но вот скажите мне, ну кому этот рейтинг нужен, многие вообще его не замечают, а есть еще куча уникумов, кторые специально рейтинг понижают, ставя единицы. Так вот, мое мнение, что модуль topnews должен выводить новости в порядке, соответствующем количеству ПРОСМОТРОВ новости. Вот так будет правильный модуль, который выводит наиболее прочитанные (просмотренные) новости на сайте.
Я думаю многие со мной согласятся. Модуль topnews вообще как-то странно устроен - он проверяет новость по порядку сначала на рейтинг новости, потом на количество комментариев у новости, и уж только после этого смотрит на количество просмотров. Я соглашусь с теми, что рейтинг популярных новостей можно также строить и по количеству комментариев, так что ниже и мы и рассмотрим как сделать вывод новостей по количеству просмотров и по количеству комментариев.
Для того чтобы сделать вывод новостей по количеству просмотров новости делаем следующее - в строке
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,10" );
удаляем rating DESC, comm_num DESC, чтобы получилось следующее
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND date < '$this_month' ORDER BY news_read DESC, date DESC LIMIT 0,10" );
Для того чтобы выводились новости по количеству комментариев у новости, то делаем почти тоже самое, только оставляем comm_num DESC
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND date < '$this_month' ORDER BY comm_num DESC date DESC LIMIT 0,10" );
Или можно совместить эти два параметра вывода удалив из строки только rating DESC, .
И, подводя итоги, я хочу поделиться также способом, касающимся того, как сделать чтобы новости выводились не за месяц (как по умолчанию стоит в модуле), а за любой срок. В Интернет по этому поводу все ссылки введут на сайты, рекомендующие удалять строку
$this_month = date( 'Y-m-d H:i:s', $_TIME );
и заменять нижеследующую измененным кодом.
На этот счет у меня также свое мнение. Ничего удалять не нужно, просто нужно правильно изменять нужную строку. Итак, для того чтобы изменить интервал, за который выводятся новости в блоке topnews, нужно в строке
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,10" );
изменить параметр INTERVAL 1 MONTH на нужное количество месяцев, т.е. если мы хотим чтобы рейтинг строился за полгода, то строка должна иметь вид
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 6 MONTH AND date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,10" );
А если мы хотим видеть вывод новостей вообще за все время существования сайта, то достаточно в параметре интервала указать какое-то выдуманное ОГРОМНОЕ число, взятое "с потолка"
$db->query( "SELECT id, title, date, alt_name, category, flag FROM " . PREFIX . "_post WHERE approve='1' AND date >= '$this_month' - INTERVAL 712548 MONTH AND date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,10" );
Если взять число месяцев из вышеприведенного примера, то я не думаю, что у кого то сайт уже существует более 712548 месяцев, так что получается, что мы берем за интервал все время существования сайта.
Вообщем-то и все по модулю topnews, надеюсь моя статья Вам пригодится, если что-то не получается - пишите в коментах вопросы.
P.S. Для того чтобы добавить title (всплывающие подсказки) для ссылок в блоке, то в строке
$link = "<a {$go_page}href=\"" . $full_link . "\">" . stripslashes( $title ) . "</a>";
сделайте такие изменения
$link = "<a {$go_page}href=\"" . $full_link . "\" title=\"сюда вписывайте текст для титла\">" . stripslashes( $title ) . "</a>";;
Также в title блока topnews можно включить даже название новости, для этого сделайте такие изменения
$link = "<a {$go_page}href=\"" . $full_link . "\" title=\"" . $title . " сюда вписывайте текст для титла\">" . stripslashes( $title ) . "</a>";
P.S.S. И еще один совет по модулю topnews - для того чтобы изменить количество символов обрезания названия новости в ссылке блока topnews в строке
if( strlen( $row['title'] ) > 55 ) $title = substr( $row['title'], 0, 55 ) . " ...";
цифру 55 измените на нужную Вам - чем больше эта цифра, тем длинее будет ссылка.
На это раз уже точно все. Всех с наступающим Новым годом! :)))