Вы не зашли.
Обрати внимание - в таблице _news есть индексы по всем полям. по которым возможна сортировка.
Ты же добавляешь вычисляемое поле (кстати, оно работает?) и при таком отображению mySQL'ю нужно будет каждый раз просматривать все новости.
Если на сайте их 10-100-500, то особых проблем не будет.
А вот если хотябы 1000+, то тормоза будут уже заметны
Оно работает
А я же делал сначала поле в _news, в которое при голосовании записывается итоговый результат (rating / votes) чтобы потом по нему можно было сортировать.. Это что получается, нужно убрать сортировку по вычисляемому полю, и сделать как раньше было? Допустим.
А с индексами я не работал, если при установке я добавляю дополнительное поле в таблицу _news, то как добавить индекс для этого поля, и сортировать по нему для уменьшения нагрузки при большом количестве новостей?
А вот как работает рейтинг сейчас, сделал сборку как и обещал. Архив в формате 7-Zip:
Что-то с загрузкой файлов на форум туговато, я только вижу ошибку "Соединение закрыто удаленным сервером", ограничение по размеру стоит?...
Залил на народ, он безотказен
http://narod.ru/disk/29346943001/0.9.3% … 1).7z.html
Не, что-то "for 0.9.3" не канает
Всё работает, но в админке, самым мистическим образом, пропала настройка сортировки по рейтингу, в конфигах всё описано, всё заменено и отредактировано, а настройки пропали, хотя в 0.9.2 работает
А так, всё устанавливается и голосуется нормально, только настройки этой нету...
Разбираться буду уже завтра...
У тебя выбор получается, либо рейтинговые наверху - пользователи не видят новых новостей, либо внизу - говно на главной
Да я понял.. Ну можно же как-то выводить последние новости на главной? Придумаем что-нибудь, я все сразу не могу предусмотреть, тем-более с моим скудным опытом программирования. Всё будет - но не сразу
Можно даже, например, по 3 новых новости, и/или новости с низким рейтингом (даже пусть рандомно) выводить на главной, и даже внутри категории? Это мысль. Может даже такой плагин уже существует, а я не в курсе.
В любом случае придумаем что-нибудь, и будет вообще всё в шоколаде
Никак не отсортируешь ты глобально новости на главной адекватно по рейтингу, да и не нужно это, все твои новые новости будут на последней странице и их никто не увидит никогда
Все сортируется, хочешь по ASC, хочешь по DESC, хочешь - новые новости будут в начале, хочешь новые новости будут в конце, хочешь сортируй по ID новости или по дате, всё настраивается в админке, если не надо - всегда можно изменить
По каким-то параметрам нужно-же сортировать, не рандомно же их сортировать?! Яша проиндексирует, пользователь найдет что-то, зайдет на сайт - а там рандомно уже другая новость отображается это-же не вариант..
Чтобы пользователь что-то увидел из имеющихся, например, нескольких тысяч новостей, есть поиск, "последние новости", "похожие новости", что-то еще, и фантазия
Подожди, дай я соберу всё это дело, а потом уже посмотрим...
rating / votes
Мы вроде пришли к мнению, что это ерунда полнейшая
Как так?
А как еще сортировать?
Как оно работает никого не интересует
А жаль
Но вся эта информация в любом случае пригодится при тестировании, еще как пригодится...
А сборку - не вопрос, сделаю
Что-то длинный пост получился
А может кто-нибудь сей сабж потестировать? А?
Плагин "Rating" 0.6 Alpha test - modified by ikv777vlg, for Next Generation CMS 0.9.3
Модифицированный плагин рейтинга новостей для Next Generation CMS 0.9.X.
ТЕСТОВОЕ ОПИСАНИЕ! Если что забыл или перепутал - поправьте меня!
Обращение к рядовым пользователям - не устанавливайте этот плагин на работающий сайт, плагин еще не проверен, не оптимизирован и не доработан.
Это тестовая версия. Никто не несет ответственность за его работу.
+ Добавлено сохранение идентификатора и IP-адреса проголосовавшего пользователя в базу данных, теперь голосовать можно с отключенными куками
+ В настройки плагина добавлен выбор трех режимов работы плагина - IP+UserID+Cookies, UserID+Cookies и обычный режим - Только Cookies
+ В настройки плагина добавлена возможность задать время хранения информации о каждом голосе в БД, и время хранения кукисов в браузере проголосовавшего пользователя, от 1 до 12 месяцев.
+ Добавлена функция, изменяющая стандартный текст (Голосов: XX) на (XX голос), (XX голосов), (XX голоса), (Нет голосов), окончание именяется в зависимости от количества голосов.
+ Добавлена сортировка новостей по рейтингу на главной странице.
* В связи с этим были незначительно изменены шаблоны, конфиги, и добавлены новые и поля и таблицы в базу данных.
* Изменена сортировка по рейтингу в категориях. Была сортировка по полю "rating", теперь по полям "(rating / votes)".
* Функция extra_get_param , была переименована в pluginGetVariable, везде где только можно. Зачем функцию через функцию использовать?!
*+ И что-то еще
Установка...
Сначала создайте новую таблицу "префикс_rating" и четыре поля в ней по данному SQL-дампу:
-- phpMyAdmin SQL Dump
-- version 3.2.3
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Oct 23, 2011 at 02:16 PM
-- Server version: 5.1.40
-- PHP Version: 5.3.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Database: `c2`
--
-- --------------------------------------------------------
--
-- Table structure for table `ng_rating`
--
CREATE TABLE IF NOT EXISTS `ng_rating` (
`news_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`ip` varchar(15) NOT NULL,
`vote_date` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `ng_rating`
--
Префикс "ng_" измените на свой!
Всё база данных готова.
Заменяем файлы "./engine/plugins/rating/rating.php" и "./engine/plugins/rating/config.php" на файлы из приложенного архива
Дальше...
В стандартных шаблонах изменяем:
В news.full.tpl ищем:
<td style="background-image:url('{tpl_url}/images/2z_64.gif');" width="100%" class="mw_links">[comheader] Комментариев: {comnum} |[/comheader] Просмотров: {views} | [print-link]{l_print}[/print-link]</td>
И в конец этой строки вот так добавляем переменную {rated}:
<td style="background-image:url('{tpl_url}/images/2z_64.gif');" width="100%" class="mw_links">[comheader] Комментариев: {comnum} |[/comheader] Просмотров: {views} | [print-link]{l_print}[/print-link] | {rated}</td>
В news.short.tpl ищем:
<td style="background-image:url('{tpl_url}/images/2z_64.gif');" width="100%" class="mw_links"> [comheader]Комментарии: {comments-num} |[/comheader] Просмотров: {views} | [full-link]<b>Подробнее</b>[/full-link]</td>
И так-же как и в шаблоне полной новости, мы вставляем в конец этой строки переменную {rated}:
<td style="background-image:url('{tpl_url}/images/2z_64.gif');" width="100%" class="mw_links"> [comheader]Комментарии: {comments-num} |[/comheader] Просмотров: {views} | [full-link]<b>Подробнее</b>[/full-link] | {rated}</td>
Изменяем стандартные шаблоны плагина:
В rating.form.tpl и rating.tpl ищем:
({l_rating_votes} {votes})
и изменяем на
({votes})
-----------------------------------------
Открываем файл "./engine/plugins/rating/lang/russian/site.ini"
Вставляем туда строки:
votes0 = "голос"
votes1 = "голоса"
votes2 = "голосов"
no_votes = "Нет"
Открываем файл "./engine/includes/inc/functions.inc.php":
Находим строку:
foreach (array('id desc', 'id asc', 'postdate desc', 'postdate asc', 'title desc', 'title asc', 'rating desc', 'rating asc') as $v) {
Ее заменяем на:
foreach (array('id desc', 'id asc', 'postdate desc', 'postdate asc', 'title desc', 'title asc', '(rating / votes) desc', '(rating / votes) asc') as $v) {
а следующую строку:
$vx = str_replace(' ','_',$v);
меняем на:
$vx = str_replace(array(' / ', '(', ')'),'',$v);
$vx = str_replace(' ','_',$vx);
Далее открываем файл "./engine/lang/russian/admin/categories.ini":
Находим 2 строки:
order_rating_desc = "рейтингу / убывание"
order_rating_asc = "рейтингу / возрастание"
Заменяем их на:
order_ratingvotes_desc = "рейтингу / убывание"
order_ratingvotes_asc = "рейтингу / возрастание"
Всё, сохраняем закрываем..
Открываем "./engine/lang/russian/admin/configuration.ini":
Находим строку:
order_title_asc = "наименованию / возрастание"
И после нее вставляем:
order_rating_desc = "рейтингу / убывание"
order_rating_asc = "рейтингу / возрастание"
Всё..
Теперь отрываем "./engine/includes/news.php":
Находим строку:
foreach ($mysql->select($query['result']) as $row) {
Заменить на:
foreach ($db_res as $row) {
И перед ней вставить:
$db_res=$mysql->select($query['result']);
foreach($db_res as $row) $list_id[] = $row['id'];
-----------------------------------------------------
Находим строку:
if (!in_array($orderBy, array('id desc', 'id asc', 'postdate desc', 'postdate asc', 'title desc', 'title asc')))
Заменяем на:
if (!in_array($orderBy, array('id desc', 'id asc', '(rating / votes) desc', '(rating / votes) asc', 'postdate desc', 'postdate asc', 'title desc', 'title asc')))
-----------------------------------------------------
Находим код:
if (!is_array($row = $mysql->record("select * from ".prefix."_news where approve=1".(count($filter)?' and '.implode(" and ",$filter):'')))) {
if (!$params['FFC']) {
error404();
}
return false;
}
После него вставляем(расположение под сомнением, но работает):
$list_id[0]=$row['id'];
------------------------------------------------------
Находим строки:
global $year, $month, $day, $SUPRESS_TEMPLATE_SHOW;
и
global $SYSTEM_FLAGS, $TemplateCache;
И после каждой строки вставляем(объявляем глобальную переменную $list_id; в функциях news_showlist и news_showone):
global $list_id;
------------------------------------------------------
Вроде ничего не забыл...
Редактирую сообщение. Поправка. Я же говорил что могу что-то пропустить
Еще нужно открыть файл "./engine/actions/configuration.php":
Находим строку:
'default_newsorder' => MakeDropDown(array('id desc' => $lang['order_id_desc'], 'id asc' => $lang['order_id_asc'], 'postdate desc' => $lang['order_postdate_desc'], 'postdate asc' => $lang['order_postdate_asc'], 'title desc' => $lang['order_title_desc'], 'title asc' => $lang['order_title_asc']), "save_con[default_newsorder]", $config['default_newsorder']),
Заменяем на:
'default_newsorder' => MakeDropDown(array('id desc' => $lang['order_id_desc'], 'id asc' => $lang['order_id_asc'], '(rating / votes) desc' => $lang['order_rating_desc'], '(rating / votes) asc' => $lang['order_rating_asc'], 'postdate desc' => $lang['order_postdate_desc'], 'postdate asc' => $lang['order_postdate_asc'], 'title desc' => $lang['order_title_desc'], 'title asc' => $lang['order_title_asc']), "save_con[default_newsorder]", $config['default_newsorder']),
Теперь точно всё...
Всё просто и легко.
У меня всё работало...
rating.php и config.php прикрепил.
Вопрос отпал после частичного изучения функции LoadPluginLang()
global $lang;
LoadPluginLang('rating', 'site');
echo $lang['rating_VarableInSite'];
так работает.
Всем спасибо
OK.
Правда я top_news еще не пробовал, я еще пока никак не определюсь что мне нужно...
У меня вопрос есть, а в "engine/plugins/rating/lang/russian" лежат *.ini файлы, а как в скрипте получить их содержимое? Я просто думаю что текст (22 голоса) будет смотреться красивее чем стандартное - (Голосов: 22). И если я правильно понимаю - ["XX голоса", "XX голосов", "XX голос"] нужно вынести в этот ini-шник.
Вынести-то я вынес, как получить - не знаю
Если мы говорим о новостных порталах
Лично я хочу сделать не совсем новостной портал, т.е. не варезник
Сортировку по рейтингу нужно использовать, как я уже писал, в блоках типа "Лучшее за неделю/месяц". Очень удобно.
А это тоже надо. Где взять такой блок?
Короче блоГ надо делать, что-то туда писать, и его монетизировать, геморрой я какой-то придумал на свою голову, не потянуть мне такой проект в ближайшее время. Столько всего надо сделать, мозг плавится
Но плагин надо дошаманить в любом случае...
Да, этот вопрос меня тоже волнует, если мы имеем 1000 плохих (я не буду использовать слово "отрицательных" ) голосов за новость, и если новость вдруг неожиданно заслужит уважение новых посетителей, и они начнут ставить ей хорошие оценки, это сколько-же надо новых уникальных пользователей отдающих этой новости хорошую оценку, чтобы у нее серьезно поднялся рейтинг?
При небольшом количестве посетителей оценка новости очень долго будет держаться "1", "2" или "3", и, действительно, мало чем будет отличаться от оценок остальных новостей...
А что делать?
rating - суммарный рейтинг, всегда положителен
votes - число голосований, нужно для получения среднего рейтинга, всегда положительноА теперь скажите как у вас при выполнении деления одного положительного числа на другое положительное число получается "и результат и будет рейтингом, положительным или отрицательным" ?
Я неправильно выразился, я не число имел ввиду, извиняйте...
Отрицательным - значит плохим, в данном случае
Забавно... Я изменил конфиги и теперь из админки доступна сортировка новостей на главной по (rating / votes) desc и asc.
А вот мне интересно, сортировка новостей в категориях доступна по полю rating, а какой смысл по rating сортировать?
Ведь rating надо же на votes делить, и результат и будет рейтингом, положительным или отрицательным, и по нему сортировать.
Разве нет?
На всякий случай. MySQL - это не халам-балам, тут осторожно надо
А сортировки по рейтингу на главной странице не было, значит теперь будет.
А сортировать новости по рейтингу вот так можно - "(rating / votes) desc"? Вроде сортирует...
А то я поначалу создавал дополнительное поле, куда записывал итоговый рейтинг, и сортировал по нему, а теперь думаю это поле убрать
1. extra_get_param не нужно использовать, вместо него pluginGetVariable
2. С использованием тернарного оператораpluginGetVariable($plugin, 'var') ? pluginGetVariable($plugin, 'var') : '3'
Понял, реализовал. Пришлось кое-чего поменять, но не зря, всё работает.
+ заменил везде в плагине extra_get_param на pluginGetVariable, это после того как я заглянул в файл extras.inc.php:
// OLD
function extra_get_param($module, $var) { return pluginGetVariable($module, $var); }
Если "OLD", то убрать ее надо, хотя тут я промолчу, я же работаю с NG CMS 0.9.2 Release [SVN646]
На новую версию пока руки не доходят сайт перенести..
Ага.. А как задать в конфиге плагина значение по умолчанию в выпадающем меню
<select>
<option>Пункт 1</option>
<option>Пункт 2</option>
<option>Пункт 3</option>
</select>
?
По умолчанию, после установки CMS и/или плагина, в extra_get_param($plugin,'PluginVarable') нули, и выбирается первый пункт меню<option>Пункт 1</option>, а как задать другое значение по умолчанию? Чтобы там был не "0", а например "3"?
Возможно такое сделать, или нет?
Если нет, то придется придумывать другое решение..
* пардон, не меню, а элементы списка
Забежал чуть вперед, и сделал в конфиге выбор [IP+UserID+Cookie или UserID+Cookie или Только Cookie] пусть админ сам выбирает делать лишний запрос в БД или нет, и нужна-ли ему вообще защита от накруток, может кукисов будет достаточно, правда в rating.php еще не реализовал, но это будет не трудно сделать с помощью IF'ов ...
А я вот думаю, наверное еще стоит дать админу выбор, на какой промежуток времени ставить куки в браузер, и через какой промежуток времени стоит удалять голоса пользователей из БД - 1 месяц ... 1 год.
Правильно же? Мало-ли для каких целей может использоваться плагин и движок
Я уже на подсознательном уровне выдаю правильные решения
Это твое подсознание выдало пост #76?! Мне бы так
А я сначала не стал лезть в news.php а потом уже пришлось, и все получилось
Теперь надо оптимизировать процесс голосования, записи информации в БД, сортировки по рейтингу, и т.д.
Мысли у меня есть по этому поводу...
Фильтр вешается на showNews, то есть когда рендерится новость. Ты в полную новость зайди и увидишь все, что нифига рейтинг твой работать не будет
Я захожу - http://domain_name/категория/новость.html:
SQL queries:
[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0003 ] select * from ng_users where authcookie = '31bc5f0c2354144ef5d3ab2823c9b5b7' limit 1
[ 0.0003 ] select * from ng_news where approve=1 and alt_name='testovaya_novost'
[ 0.0002 ] select news_id from ng_rating WHERE (user_id='1' or ip='127.0.0.1') and (news_id=5)
[ 0.0002 ] update ng_news set views=views+1 where id = '5'
работает же
А в чем подвох тогда?
Раз никто не отвечает, вопрос задавал 2 раза, от безысходности я полез в news.php и нашел ответ на свой вопрос... Всё понятно
Далее...
vitaly пишет:Wolverine, проблема в том, что полный список ID'шников ты узнаёшь в самом конце
Мысли на самом деле есть, возможно успею сделать до релизаПо идее можно сделать в showlist не
foreach ($mysql->select($query['result']) as $row) { $i++; $nCount++;
а
$blablabla = $mysql->select($query['result']); # запихивам информацию о всех новостях
в global пишем ID'шники
foreach($blablabla as $row) $global_var[] = $row['id'];
а дальше уже проходиться по каждой новости, генерируя её отображение, но в каждом вызове showNews уже будет доступна $global_var
foreach ($blablabla as $row) { $i++; $nCount++;
А кстати этот способ работает
И в news_showone() тоже можно id получить, а почему нет? Проверил, всё работает на главной и в категориях, мы имеем полный список ID`шников новостей, и при просмотре полной новости мы имеем в $list_id[0] - ID полной новости.
[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0003 ] select * from ng_users where authcookie = '31bc5f0c2354144ef5d3ab2823c9b5b7' limit 1
[ 0.0005 ] SELECT * FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1') order by ratesort desc, postdate desc limit 0,3
[ 0.0002 ] select news_id from ng_rating WHERE (user_id='1' or ip='127.0.0.1') and (news_id=6 or news_id=7 or news_id=2)
[ 0.0002 ] SELECT count(*) as count FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1')
Правда function ipcheck будет работать кривовато в итоге при таком подходе, на главной странице или в любом месте где выводится список новостей через news_showlist все будет ОК, а вот в полной новости список $list_id мы уже не будем иметь на руках. Так что нужно проверять еще в showNews если новость короткая, то есть $mode['style'] == 'short' , то использовать глобальный массив, который мы надеемся заполнен, а если полная ( $mode['style'] == 'full' ), то нужно делать другой запрос к таблице рейтига самостоятельно.
А вот тут я ничего не понял... Работает же, а причем тут showNews, ты мне объясни
Игнорируете меня уже? И за что, если не секрет? Что не так?!
Wolverine пишет:о можно написать
$ids = array(); foreach($list_id as $id) $ids[] = "news_id = {$id}"; ...
А если $list_id не определён или в нём какая-то фигня? Будут варнинги
Так что проверка с is_array() крайне желательна.
Это да, тоже надо, так и делал по началу . Тем-более не внутри функции, мало-ли когда rating.php выполнится.
А мой вопрос остается в силе, как этот самый $list_id получить...
Обновил выше весь кусок
OK, спасибо, изучаю