Вы не зашли.
Ах точно!... я тут чуть-чуть не выспался
, добавлю еще одно условие, очистку раз в сутки, как ты говоришь.
Действительно, с каждым голосом запускать очистку нет смысла, можно и раз в сутки, я же не корабль в космос запускаю, 1 день роли не сыграет.
Спасибо! ![]()
Не в сети
А как работать c pluginSetVariable() и pluginGetVariable()?
Вот так правильно?
pluginSetVariable('rating', 'last_clear', time()); // сначала создаем переменную и задаем ей значение
pluginsSaveConfig(); // где-то сохраняем :)
echo intval(pluginGetVariable('rating', 'last_clear')); // и в любой момент, из любого скрипта, считываем значениеПеременная last_clear будет храниться постоянно? А если она вдруг больше не нужна, как ее удалить, задать пустое значение, или еще как?
А вообще, не хватает документации по всем подобным функциям, которые можно вызывать в плагинах.
Или такая документация есть? Я просто не в курсе, уж извиняйте ![]()
Изменено ikv777vlg (2011-10-15 12:48:01)
Не в сети
pluginSetVariable($pluginID, $var, $value)
pluginGetVariable($pluginID, $var)
то есть правильно
для удаления функции нет, но можно сделать самому:
global PLUGINS;
unset($PLUGINS['config'][$pluginID][$var]);
pluginsSaveConfig();Не в сети
А вообще, не хватает документации по всем подобным функциям, которые можно вызывать в плагинах.
Или такая документация есть? Я просто не в курсе, уж извиняйте
Есть http://wiki.ngcms.ru но она пока не полная...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg пишет:А вообще, не хватает документации по всем подобным функциям, которые можно вызывать в плагинах.
Или такая документация есть? Я просто не в курсе, уж извиняйтеЕсть http://wiki.ngcms.ru но она пока не полная...
Но ведь никто лучше создателей CMS не знает что там за функции в том-же, например extras.inc.php
, я заглянул туда, а там темный лес, черт ногу сломит с моими знаниями PHP, хотя некоторую информацию можно почерпнуть из комментариев на английском, это очень хорошо, но неудобно конечно ![]()
А теперь по сабжу. Я сделал вот так, вроде работает:
if(intval(pluginGetVariable('rating', 'last_clear')) <= time()) { // проверяем промежуток времени очистки таблицы
$mysql->query('DELETE FROM `'.prefix.'_rating` WHERE `vote_date` < '.(time()-5184000).';'); // удаляем старые записи
pluginSetVariable('rating', 'last_clear', (time()+86400));
pluginsSaveConfig();
}как всё просто ![]()
Вот только куда этот IF лучше вставить? Я считаю, что лучше обрабатывать его когда пользователь голосует($upd=1), а не после каждой проверки голосовал ли юзер ($upd=0). Тем-более при обычной загрузки новости, плагин всегда обращается к функции, делается выбор - просто показать рейтинг, или показать рейтинг+ссылки для голосования (если IP или печенька не найдена).
Пишите что еще не так, может где-то еще я был не прав ![]()
Не в сети
Но ведь никто лучше создателей CMS не знает что там за функции в том-же, например extras.inc.php
, я заглянул туда, а там темный лес, черт ногу сломит с моими знаниями PHP, хотя некоторую информацию можно почерпнуть из комментариев на английском, это очень хорошо, но неудобно конечно
Напиши какие именно функции из extras.inc.php ты хочешь знать и на http://wiki.ngcms.ru/ я их распишу...
P.S. Только не надо говорить просто ВСЕ ![]()
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
Там вроде комментарии есть хорошие.
Например по теме:
//
// Save configuration parameters of plugins (should be called after pluginSetVariable)
//
function pluginsSaveConfig($suppressNotify = false)Не в сети
Юзеры чаще будут просто просматривать новость, чем голосовать, тем-более голосование вызывается аяксом, пока будет очищаться таблица, юзер будет видеть картинку "Loading..." в центре страницы, и в итоге получается такой принцип: "Проголосовал? Оставил свой IP в базе? По братски - удали старые записи из БД!"
И в итоге при загрузке страницы очистка никак не выполнится, и страница будет грузиться быстрее.
Так что, ИМХО, всё логично и оптимально ![]()
Напиши какие именно функции из extras.inc.php ты хочешь знать и на http://wiki.ngcms.ru/ я их распишу...
P.S. Только не надо говорить просто ВСЕ
Все и в extras.inc.php и в functions.inc.php, и везде где они есть ![]()
ROZARD, а если серьезно, спасибо конечно тебе, но я же не знаю где какая функция, и в какой момент она мне может пригодиться. Вдруг я решусь создать какой-нибудь полезный плагин и что-то смогу реализовать на чистом PHP, а окажется что это уже реализовано в функциях CMS. Так-что всё постепенно. А при изменении плагина, и так можно разобраться где находится вызываемая функция, и что она делает, хотя бывает трудно, даже с комментариями на английском. В этом случае буду спрашивать тут ![]()
Там вроде комментарии есть хорошие.
Например по теме:
// // Save configuration parameters of plugins (should be called after pluginSetVariable) // function pluginsSaveConfig($suppressNotify = false)
Согласен. Но попробуй встать на мое место, если я первый раз вижу строчку комментария "Save configuration parameters of plugins" я же не могу понять какие параметры сохраняются, что это за параметры такие, при знании PHP "со словарем"
В далеком будущем при детальном изучении работы CMS, что да как, эти вопросы может и отпадут, но пока мало что понятно. NG CMS вообще заинтересовала меня, и отсутствие красивого дефолтного шаблона меня не испугало, буду делать сайт на NG CMS, вроде всё что нужно в ней есть ![]()
А пока я попробую сделать еще что-нибудь хорошее в плагине rating, раз взялся, надо же попытаться его до ума довести! ![]()
Не в сети
И еще... В rating.php перед "class RatingNewsFilter extends NewsFilter {" есть непонятный комментарий:
//
// ”Ё«мва ®ў®б⥩ (¤«п Ї®Є § ३⨣ )
//Из-за этого все комментарии в скриптах CMS на английском пишите? ![]()
Кстати, в при создании плагина, нельзя комментарии на кириллице писать? Или мне всё на английский переводить? ![]()
Имхо, надо-же определяться, если Win-1251 - значит Win-1251...
Не в сети
Просто ошибка кодировки, в комментариях хоть на иврите пиши. Просто комментарии на кириллице по большому счеты бесполезны для всех, кроме русскоговорящих ![]()
Не в сети
ikv777vlg, по поводу коммента - косяк, коммент оказался в CP866 кодировке.
Вообще ты делаешь очень быстрые успехи, молодец. Даже приятно становится ![]()
Вообще в коде ещё есть над чем работать,.. но он уже значительно лучше того, который был в самом начале.
Относительно документации - действительно, она есть не вся. Если что-то непонятно (или хочешь узнать есть ли тот или иной функционал) - можешь спрашивать на форуме, поможем ![]()
Не в сети
vitaly, спасибо, один я бы ничего не сделал, спасибо всем вам!
Wolverine, я всё слышал! ![]()
Понятное дело, надо как-то зарабатывать деньги, что-то делать.. Мне нужно сайт запустить, нужен был плагин, были трудности, я к вам обратился, вы мне помогли, с меня - как минимум, индексируемая ссылка с главной страницы моего сайта, или даже со статьи, разберемся. Если, конечно, я этот сайт когда-нибудь доделаю ![]()
В сапе я и сам буду ссылки продавать, хочу попробовать аккуратно всё это реализовать, и чтобы это был СДЛ, но на ngcms.ru ссылку поставлю в любом случае, дай Бог и мне ТИЦа высокого ![]()
Вообще у меня сейчас достаточно свободного времени, пока я просто не работаю, а работа у меня не легкая, и график даалеко не 8-ми часовой, так что незнаю что будет дальше, как минимум еще неделю я свободен, а потом у меня времени и сил будет в разы меньше..
Тут знаете сколько проблем, помимо тех что в виртуальной реальности? Много! И учиться надо, и работать... Я даже не считаю то что у меня сейчас на правой руке или сильный ушиб, или трещина в кости, рука болит, собственно по этому я и не работаю сейчас, зато мышку могу перемещать по коврику ![]()
Ой от души выговорился, мужики, извиняйте за оффтоп ![]()
Проекту помогу еще не раз, чем смогу, надеюсь не один сайт на NG CMS буду делать, будет дебаг, предложения и доработки всякие, замутим что-нибудь, это обязательно ![]()
А теперь по теме...
vitaly, как раз у меня к тебе вопрос. Вот ты писал недавно:
Imho, правильней хранить данные о каждом голосе.
newsID, userID, IP, voteDate
для незарегенного юзера userID будет нулевым.
тогда и проблема очистки будет решаться намного проще и конфликтов вида "двое нажали одновременно на <голосовать>, но только один из голосов появился в таблице" (если несколько человек сидят на одном сайте за NAT'ом) не будет
и поставил меня на путь истинный
, я немного переделал скрипт, добавил пару полей в БД всё работает, но...
Изначально в моей функции есть косяк. Я не пойму, причем тут User ID ? ![]()
Теперь получается что незалогиненный 127.0.0.1+UserID=0 проголосовал один раз за новость, потом вошел на сайт, и опять у него появляется возможность проголосовать за ту же новость, т.к. это уже 127.0.0.1+UserID=1
Что-то я не пойму логику, UserID надо или убрать, или делать как-то по другому ![]()
Запутался я короче говоря, или я неправильно тебя понял... ![]()
Хотя... Может писать в базу надо IP+UserID+NewsID а читать (IP+NewsID or UserID+NewsID) ?
А смысл? Опять я что-то не догоняю...
Не в сети
В твоем случае UserID не нужен, один хрен разрешать голосовать или нет ты разрешаешь только по IP. В предложении Виталия предлагается дать возможность для голосования с одного IP, тебе это вроде как не нужно. Можно сделать две версии защиты, например, жестко считать только IP или давать возможность разным пользователям головать с одного IP
Не в сети
В твоем случае UserID не нужен, один хрен разрешать голосовать или нет ты разрешаешь только по IP
Вот и я о том-же..
Да, но могут-же и несколько юзеров с одного IP на сайт заходить, желательно бы их всех различать, но это невозможно, если только дополнительные заголовки вместе с IP не считывать, или еще как-то ![]()
Значит я UserID убираю, хотя я подумаю еще над этим...
Не в сети
или давать возможность разным пользователям голосовать с одного IP
Получается, логичнее это делать только при включенной опции "Рейтинг только для зарегистрированных" в настройках плагина?
Стоп, а разве даже если включено - "Рейтинг только для зарегистрированных", в БД не пишется UserID того кто проголосовал за новости, а тоже только печенька в браузер ставится?
Тогда конечно надо сделать, мне это не нужно, но кому-нибудь обязательно пригодится!..
Опять-же, если зарегистрированному юзеру удалить куки, и войти на сайт, с одного ip, потом с другого(если у него динамический IP), и возможность проголосовать может то появляться, то пропадать, если IP найдется.
Отсюда вывод - поле UserID я оставлю, просто нужно искать и сравнивать результаты в БД как я и сказал раньше - и IP+NewsID, и UserID+NewsID вот и логика, хоть включай "Рейтинг только для зарегистрированных", хоть выключай, результат одинаковый - один IP несколько раз проголосовать за одну новость не сможет, и один UserID тоже ![]()
С другой стороны - если включено "Рейтинг только для зарегистрированных" то на IP можно вообще не обращать внимания, а делить голосующих по UserID... Надо выбрать какой-нибудь вариант.
Ой я пойду покурю... ![]()
Не в сети
Апдейт. Только так и больше никак, и IP, и ID пользователя надо учитывать, если он зарегистрирован.
function ipcheck ($news_id, $upd) {
global $ip, $mysql, $userROW;
/* Ищем в базе строку с текущими IP или User ID и News ID */
if($mysql->record("select * from ".prefix."_rating where (user_id='".intval(is_array($userROW))."' or ip='".$ip."') and news_id='".$news_id."'")) {
return true; /* Юзер уже голосовал за эту новость, возвращаем истину */
}
else {
/* Юзер еще не голосовал за эту новость */
if($upd){
if(intval(pluginGetVariable('rating', 'last_clear')) <= time()) { // проверяем промежуток времени очистки таблицы
$mysql->query('DELETE FROM `'.prefix.'_rating` WHERE `vote_date` < '.(time()-5184000).';'); // удаляем старые записи
pluginSetVariable('rating', 'last_clear', (time()+86400));
pluginsSaveConfig();
}
// далее голосуем
$mysql->query("INSERT INTO ".prefix."_rating set user_id='".intval(is_array($userROW))."', vote_date=".time().", ip='".$ip."', news_id='".$news_id."'");
}
return false;
}
}Вот только опять косяк у меня - 10 SQL запросов (time: 0.04 сек.) при загрузке главной страницы, и превью 3-х новостей, каждая новость добавляет два запроса! ![]()
SQL queries:
[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0002 ] select * from ng_users where authcookie = 'e20d1756ef6c888e3bd2a6ea99968536' limit 1
[ 0.0006 ] SELECT * FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1') order by ratesort desc, postdate desc limit 0,3
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='2'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='2'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='5'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='5'
[ 0.0002 ] SELECT count(*) as count FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1')
Вот такая колбаса! ![]()
Буду исправлять...
Не в сети
Так проверять нужно при нажатии, а не как только зайдет на сайт ![]()
Не очень понятна:
(user_id='".intval(is_array($userROW))."'тут походу intval выручает))
Скорее:
user_id='".intval($userROW['id'])."'и скобки не обязательны...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
Так проверять нужно при нажатии, а не как только зайдет на сайт
Логично
Но, я проверяю для того, чтобы выдать или не выдать к новости "5 больших звезд" для голосования, а зачем пользователю опять показывать звёзды, если он уже проголосовал? Рейтинг-то отображается в процентах от 1 до 100...
Не в сети
Тогда делай один запрос пройдясь по всей таблице и запиши всё в одну переменную и по ней уже сравнивай все новости.
P.S. всего кода не вижу и подробнее написать не могу...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
Ну по-хорошему надо проверять и при заходе, чтобы пользователю показывать как именно он проголосовал.. но тут правильнее уже делать JOIN к основному select'у по новостям, не уверен что штатно это получится сделать.
Не в сети
Не очень понятна:
(user_id='".intval(is_array($userROW))."'тут походу intval выручает))
Скорее:user_id='".intval($userROW['id'])."'и скобки не обязательны...
is_array($userROW) выдает ID пользователя, а что? Как было в плагине, так я и скопировал, я же не знаю до конца что там в массиве )))
Понял, значит будет $userROW['id'] а в intval() его обязательно оборачивать?
А насчет скобок, а разве без скобок получится? select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1' - этот запрос должен найти в таблице все строки с полями user_id или ip с новостью news_id='1' а как-же без скобок? Или синтаксис неправильный?
Тогда делай один запрос пройдясь по всей таблице и запиши всё в одну переменную и по ней уже сравнивай все новости.
P.S. всего кода не вижу и подробнее написать не могу...
А что его смотреть, функция вызывается всего 3 раза:
1) При голосовании, когда проверяется - вдруг в браузере уже есть печенька, и за эту новость уже голосовали
2) При голосовании, после того как в браузер ставится печенька
3) И при выборе - что показать юзеру, звёзды или просто рейтинг, и это тот самый вариант вызываемый 6 раз:
if ((isset($_COOKIE['rating'.$newsID]) && $_COOKIE['rating'.$newsID]) || (extra_get_param('rating','regonly') && !is_array($userROW)) || ipcheck($newsID, 0)) { // ipcheck 3
// Show
$tpl -> template('rating', $tpath['rating']);
$tpl -> vars('rating', $tvars);
return $tpl -> show('rating');
} else {
// Edit
$tpl -> template('rating.form', $tpath['rating.form']);
$tpl -> vars('rating.form', $tvars);
return $tpl -> show('rating.form');
}Ну по-хорошему надо проверять и при заходе, чтобы пользователю показывать как именно он проголосовал.. но тут правильнее уже делать JOIN к основному select'у по новостям, не уверен что штатно это получится сделать.
JOIN к основному select'у
- непонятно ![]()
Надо, но походу и правда не получится, у меня есть вариант - показывать звезды только при просмотре полной новости, это как вариант... Т.е только при просмотре полной новости будет добавляться 2 запроса. И почему кстати их два??... Надо разбираться...
Изменено ikv777vlg (2011-10-16 00:00:29)
Не в сети
Не в сети
is_array($userROW) выдает ID пользователя, а что?
не, is_array определяет, является ли переданный параметр массивом
Вот это да
А я забыл, и машинально принял ее за обычную функцию, которая объявлена где-то в глубине CMS
Бывает же )))))))
А ты прикинь, я незалогинен - is_array($userROW) возвращает - 0, если залогинен под учетной записью администратора, у меня User ID = 1, и is_array($userROW) тоже возвращала 1, регистрация пользователей запрещена - никакого подвоха, так-бы всё и работало )))))))) ![]()
Не в сети