Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#76 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-24 17:17:25

vitaly пишет:

Обрати внимание - в таблице _news есть индексы по всем полям. по которым возможна сортировка.
Ты же добавляешь вычисляемое поле (кстати, оно работает?) и при таком отображению mySQL'ю нужно будет каждый раз просматривать все новости.
Если на сайте их 10-100-500, то особых проблем не будет.
А вот если хотябы 1000+, то тормоза будут уже заметны smile

Оно работает smile
А я же делал сначала поле в _news, в которое при голосовании записывается итоговый результат (rating / votes) чтобы потом по нему можно было сортировать.. Это что получается, нужно убрать сортировку по вычисляемому полю, и сделать как раньше было? Допустим.
А с индексами я не работал, если при установке я добавляю дополнительное поле в таблицу _news, то как добавить индекс для этого поля, и сортировать по нему для уменьшения нагрузки при большом количестве новостей?

А вот как работает рейтинг сейчас, сделал сборку как и обещал. Архив в формате 7-Zip:
Что-то с загрузкой файлов на форум туговато, я только вижу ошибку "Соединение закрыто удаленным сервером", ограничение по размеру стоит?...
Залил на народ, он безотказен smile
http://narod.ru/disk/29346943001/0.9.3% … 1).7z.html

#77 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 23:03:40

Не, что-то "for 0.9.3" не канает tongue
Всё работает, но в админке, самым мистическим образом, пропала настройка сортировки по рейтингу, в конфигах всё описано, всё заменено и отредактировано, а настройки пропали, хотя в 0.9.2 работает smile
А так, всё устанавливается и голосуется нормально, только настройки этой нету...

Разбираться буду уже завтра...

#78 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 21:32:54

Wolverine пишет:

У тебя выбор получается, либо рейтинговые  наверху - пользователи не видят новых новостей, либо внизу - говно на главной

Да я понял.. Ну можно же как-то выводить последние новости на главной? Придумаем что-нибудь, я все сразу не могу предусмотреть, тем-более с моим скудным опытом программирования. Всё будет - но не сразу smile
Можно даже, например, по 3 новых новости, и/или новости с низким рейтингом (даже пусть рандомно) выводить на главной, и даже внутри категории? Это мысль. Может даже такой плагин уже существует, а я не в курсе.
В любом случае придумаем что-нибудь, и будет вообще всё в шоколаде smile

#79 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 21:20:14

Wolverine пишет:

Никак не отсортируешь ты глобально новости на главной адекватно по рейтингу, да и не нужно это, все твои новые новости будут на последней странице и их никто не увидит никогда

Все сортируется, хочешь по ASC, хочешь по DESC, хочешь - новые новости будут в начале, хочешь новые новости будут в конце, хочешь сортируй по ID новости или по дате, всё настраивается в админке, если не надо - всегда можно изменить smile

По каким-то параметрам нужно-же сортировать, не рандомно же их сортировать?! Яша проиндексирует, пользователь найдет что-то, зайдет на сайт - а там рандомно уже другая новость отображается big_smile это-же не вариант..
Чтобы пользователь что-то увидел из имеющихся, например, нескольких тысяч новостей, есть поиск, "последние новости", "похожие новости", что-то еще, и фантазия smile

Подожди, дай я соберу всё это дело, а потом уже посмотрим... smile

#80 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 20:49:26

Wolverine пишет:

rating / votes

Мы вроде пришли к мнению, что это ерунда полнейшая

Как так?
А как еще сортировать? hmm

#81 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 20:34:24

Wolverine пишет:

Как оно работает никого не интересует smile

А жаль big_smile
Но вся эта информация в любом случае пригодится при тестировании, еще как пригодится...

А сборку - не вопрос, сделаю wink

#82 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 20:02:03

Что-то длинный пост получился tongue
А может кто-нибудь сей сабж потестировать? А? smile

#83 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 20:00:37

Плагин "Rating" 0.6 Alpha test - modified by ikv777vlg, for Next Generation CMS 0.9.3  smile

Модифицированный плагин рейтинга новостей для Next Generation CMS 0.9.X.
ТЕСТОВОЕ ОПИСАНИЕ! Если что забыл или перепутал - поправьте меня! wink

Обращение к рядовым пользователям - не устанавливайте этот плагин на работающий сайт, плагин еще не проверен, не оптимизирован и не доработан.
Это тестовая версия. Никто не несет ответственность за его работу.  big_smile

+ Добавлено сохранение идентификатора и IP-адреса проголосовавшего пользователя в базу данных, теперь голосовать можно с отключенными куками
+ В настройки плагина добавлен выбор трех режимов работы плагина - IP+UserID+Cookies, UserID+Cookies и обычный режим - Только Cookies
+ В настройки плагина добавлена возможность задать время хранения информации о каждом голосе в БД, и время хранения кукисов в браузере проголосовавшего пользователя, от 1 до 12 месяцев.
+ Добавлена функция, изменяющая стандартный текст (Голосов: XX) на (XX голос), (XX голосов), (XX голоса), (Нет голосов), окончание именяется в зависимости от количества голосов.
+ Добавлена сортировка новостей по рейтингу на главной странице.
* В связи с этим были незначительно изменены шаблоны, конфиги, и добавлены новые и поля и таблицы в базу данных.   
* Изменена сортировка по рейтингу в категориях. Была сортировка по полю "rating", теперь по полям "(rating / votes)". 
* Функция extra_get_param , была переименована в pluginGetVariable, везде где только можно. Зачем функцию через функцию использовать?! big_smile
*+ И что-то еще smile


Установка...


Сначала создайте новую таблицу "префикс_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;

------------------------------------------------------

Вроде ничего не забыл...


Редактирую сообщение. Поправка. Я же говорил что могу что-то пропустить smile

Еще нужно открыть файл "./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']),

Теперь точно всё...



Всё просто и легко. big_smile
У меня всё работало...

rating.php и config.php прикрепил.

#84 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 10:19:31

Вопрос отпал после частичного изучения функции LoadPluginLang() smile

 global $lang;
 LoadPluginLang('rating', 'site');
 echo $lang['rating_VarableInSite'];

так работает.
Всем спасибо lol

#85 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-23 06:24:58

OK. smile
Правда я top_news еще не пробовал, я еще пока никак не определюсь что мне нужно... hmm
У меня вопрос есть, а в "engine/plugins/rating/lang/russian" лежат *.ini файлы, а как в скрипте получить их содержимое? Я просто думаю что текст (22 голоса) будет смотреться красивее чем стандартное - (Голосов: 22). И если я правильно понимаю - ["XX голоса", "XX голосов", "XX голос"] нужно вынести в этот ini-шник.
Вынести-то я вынес, как получить - не знаю smile

#86 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-22 00:24:19

Wolverine пишет:

Если мы говорим о новостных порталах

Лично я хочу сделать не совсем новостной портал, т.е. не варезник smile

Wolverine пишет:

Сортировку по рейтингу нужно использовать, как я уже писал, в блоках типа "Лучшее за неделю/месяц". Очень удобно.

А это тоже надо. Где взять такой блок? smile
Короче блоГ надо делать, что-то туда писать, и его монетизировать, геморрой я какой-то придумал на свою голову, не потянуть мне такой проект в ближайшее время. Столько всего надо сделать, мозг плавится sad
Но плагин надо дошаманить в любом случае...

#87 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 23:54:33

Да, этот вопрос меня тоже волнует, если мы имеем 1000 плохих (я не буду использовать слово "отрицательных" big_smile) голосов за новость, и если новость вдруг неожиданно заслужит уважение новых посетителей, и они начнут ставить ей хорошие оценки, это сколько-же надо новых уникальных пользователей отдающих этой новости хорошую оценку, чтобы у нее серьезно поднялся рейтинг? yikes
При небольшом количестве посетителей оценка новости очень долго будет держаться "1", "2" или "3", и, действительно, мало чем будет отличаться от оценок остальных новостей...
А что делать? hmm

#88 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 23:40:59

Wolverine пишет:

rating - суммарный рейтинг, всегда положителен
votes - число голосований, нужно для получения среднего рейтинга, всегда положительно

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

Я неправильно выразился, я не число имел ввиду, извиняйте... big_smile
Отрицательным - значит плохим, в данном случае smile

#89 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 22:24:20

Забавно... Я изменил конфиги и теперь из админки доступна сортировка новостей на главной по (rating / votes) desc и asc.
А вот мне интересно, сортировка новостей в категориях доступна по полю rating, а какой смысл по rating сортировать?
Ведь rating надо же на votes делить, и результат и будет рейтингом, положительным или отрицательным, и по нему сортировать.
Разве нет? roll

#90 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 10:46:44

На всякий случай. MySQL - это не халам-балам, тут осторожно надо big_smile
А сортировки по рейтингу на главной странице не было, значит теперь будет. cool

#91 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 10:39:15

А сортировать новости по рейтингу вот так можно - "(rating / votes) desc"? Вроде сортирует... smile
А то я поначалу создавал дополнительное поле, куда записывал итоговый рейтинг, и сортировал по нему, а теперь думаю это поле убрать tongue

#92 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 10:23:52

Wolverine пишет:

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] smile
На новую версию пока руки не доходят сайт перенести..

#93 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 08:20:10

Ага.. А как задать в конфиге плагина значение по умолчанию в выпадающем меню
<select>
  <option>Пункт 1</option>
  <option>Пункт 2</option>
  <option>Пункт 3</option>
</select>
?
По умолчанию, после установки CMS и/или плагина, в extra_get_param($plugin,'PluginVarable') нули, и выбирается первый пункт меню<option>Пункт 1</option>, а как задать другое значение по умолчанию? Чтобы там был не "0", а например "3"?
Возможно такое сделать, или нет?
Если нет, то придется придумывать другое решение..

* пардон, не меню, а элементы списка smile

#94 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-21 01:26:04

Забежал чуть вперед, и сделал в конфиге выбор [IP+UserID+Cookie или UserID+Cookie или Только Cookie] пусть админ сам выбирает делать лишний запрос в БД или нет, и нужна-ли ему вообще защита от накруток, может кукисов будет достаточно, правда в rating.php еще не реализовал, но это будет не трудно сделать с помощью IF'ов smile...

А я вот думаю, наверное еще стоит дать админу выбор, на какой промежуток времени ставить куки в браузер, и через какой промежуток времени стоит удалять голоса пользователей из БД - 1 месяц ... 1 год.
Правильно же? Мало-ли для каких целей может использоваться плагин и движок smile

#95 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-20 23:40:39

Wolverine пишет:

Я уже на подсознательном уровне выдаю правильные решения smile

Это твое подсознание выдало пост #76?! big_smile Мне бы так smile
А я сначала не стал лезть в news.php а потом уже пришлось, и все получилось tongue

Теперь надо оптимизировать процесс голосования, записи информации в БД, сортировки по рейтингу, и т.д.
Мысли у меня есть по этому поводу... wink

#96 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-20 23:27:03

Wolverine пишет:

Фильтр вешается на showNews, то есть когда рендерится новость. Ты в полную новость зайди и увидишь все, что нифига рейтинг твой работать не будет smile

Я захожу - 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'

работает же tongue

А в чем подвох тогда?

#97 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-20 23:05:58

Раз никто не отвечает, вопрос задавал 2 раза, от безысходности я полез в news.php и нашел ответ на свой вопрос... Всё понятно smile

Далее...

Wolverine пишет:
vitaly пишет:

Wolverine, проблема в том, что полный список ID'шников ты узнаёшь в самом конце smile
Мысли на самом деле есть, возможно успею сделать до релиза smile

По идее можно сделать в 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++;

А кстати этот способ работает smile
И в news_showone() тоже можно id получить, а почему нет? smile Проверил, всё работает на главной и в категориях, мы имеем полный список 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')

Wolverine пишет:

Правда function ipcheck будет работать кривовато в итоге при таком подходе, на главной странице или в любом месте где выводится список новостей через news_showlist все будет ОК, а вот в полной новости список $list_id мы уже не будем иметь на руках. Так что нужно проверять еще в showNews если новость короткая, то есть $mode['style'] == 'short' , то использовать глобальный массив, который мы надеемся заполнен, а если полная ( $mode['style'] == 'full' ), то нужно делать другой запрос к таблице рейтига самостоятельно.

А вот тут я ничего не понял... Работает же, а причем тут showNews, ты мне объясни smile

#99 Re: "А как сделать..." » Защита от накруток в плагине rating, запись IP-адреса юзера в БД » 2011-10-19 10:37:50

vitaly пишет:
Wolverine пишет:

о можно написать

$ids = array();
foreach($list_id as $id)
  $ids[] = "news_id = {$id}"; 
...

А если $list_id не определён или в нём какая-то фигня? Будут варнинги smile
Так что проверка с is_array() крайне желательна.

Это да, тоже надо, так и делал по началу . Тем-более не внутри функции, мало-ли когда rating.php выполнится.
А мой вопрос остается в силе, как этот самый $list_id получить... smile

Подвал раздела

Работает на FluxBB