Вы не зашли.
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++;
Не в сети
Доступна для скачивания версия 0.9.3 Release Candidate 1 [SVN 856]
Ооо, это хорошо
vitaly, а список ID'шников всех новостей на странице в RC 1, до загрузки плагинов никак не получить?
Не реализовал ты эту фичу?
А то у меня уже функция почти готова, ей нужен только глобальный массив со всеми ID'шниками новостей на текущей странице, она делает один запрос и записывает в глобальный массив ID всех новостей за которые юзер голосовал, а при последующем обращении к функции запрашиваемый ID новости, не ищется в БД делая лишний запрос и создавая нагрузку, а ищется в глобальном массиве. Ну как-то так
Изменено ikv777vlg (2011-10-19 08:56:13)
Не в сети
А вот, собственно обновленный код, который заменяет старую функцию ipcheck():
global $ip, $mysql, $userROW, $rating_array; /* в $list_id массив со всеми News ID на странице */ global $list_id; $list_id =array(7,5,2,1,6);
if(is_array($list_id) && count($list_id)){ // проверяем что $list_id - это массив, в нем что-то есть =)
for ($a = 1; $a <= count($list_id); $a++) {
$out_db=$out_db."news_id='".$list_id[$a-1]."' or "; // создаем кусок запроса к БД: "news_id=xx or news_id=xx ...."
}
$rating_out_db=$mysql->select("select news_id from ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".substr($out_db, 0, strlen($out_db)-3).")"); // ищем все новости из списка ID`шников, за которые голосовал этот IP
for ($a = 1; $a <= count($rating_out_db); $a++) {
$rating_array[$a]=$rating_out_db[$a-1]['news_id']; // создаем массив (глобальный) с ID`шниками новостей за которые голосовал этот IP
}
}
/* А эта функция, теперь тупо ищет ID запрашиваемой новости в глобальном массиве и возвращает true или false,
в зависимости от того, найдет ли в массиве ID запрашиваемой новости. Параметр $upd - как обычно, позволяет записать
голос в БД + удалить старые записи из БД(если прошло 24 часа после прошлого удаления)
*/
function ipcheck ($news_id, $upd) {
global $rating_array, $ip, $mysql, $userROW;
if(is_array($rating_array)){
$temp=intval(array_search($news_id, $rating_array));
}
if (is_array($rating_array) && isset($temp) && $temp) {
return true; // возвращаем скрипту истину - этот IP уже голосовал за новость
} else {
// не найдено - можно голосовать
if($upd) {
/* Сохраняем голос в базу данных : START */
$mysql->query("INSERT INTO ".prefix."_rating set user_id='".intval($userROW['id'])."', vote_date=".time().", ip=".db_squote($ip).", news_id=".db_squote($news_id));
/* Сохраняем голос в базу данных : END */
/* Удаляем старые записи : START */
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();
}
/* Удаляем старые записи : END */
}
return false; // возвращаем скрипту ложь - этот IP еще не голосовал за новость
}
}
и оно как-то работает
с условием того что $list_id - это глобальный массив со всеми идентификаторами новостей на текущей странице, и скрипт должен получить его в самом начале...
Не в сети
Жесть конечно
if(is_array($list_id) && count($list_id)){ // проверяем что $list_id - это массив, в нем что-то есть =)
for ($a = 1; $a <= count($list_id); $a++) {
$out_db=$out_db."news_id='".$list_id[$a-1]."' or "; // создаем кусок запроса к БД: "news_id=xx or news_id=xx ...."
}
$rating_out_db=$mysql->select("select news_id from ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".substr($out_db, 0, strlen($out_db)-3).")"); // ищем все новости из списка ID`шников, за которые голосовал этот IP
for ($a = 1; $a <= count($rating_out_db); $a++) {
$rating_array[$a]=$rating_out_db[$a-1]['news_id']; // создаем массив (глобальный) с ID`шниками новостей за которые голосовал этот IP
}
вместо этого можно написать
$ids = array();
foreach($list_id as $id)
$ids[] = "news_id = {$id}";
$rating_out_db=$mysql->select("select news_id from ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".implode(' OR ', $ids).")");
$rating_array = array();
foreach($rating_out_db as $id)
$rating_array[] = $id;
Не в сети
о можно написать
$ids = array(); foreach($list_id as $id) $ids[] = "news_id = {$id}"; ...
А если $list_id не определён или в нём какая-то фигня? Будут варнинги
Так что проверка с is_array() крайне желательна.
Не в сети
Wolverine пишет:о можно написать
$ids = array(); foreach($list_id as $id) $ids[] = "news_id = {$id}"; ...
А если $list_id не определён или в нём какая-то фигня? Будут варнинги
Так что проверка с is_array() крайне желательна.
Это да, тоже надо, так и делал по началу . Тем-более не внутри функции, мало-ли когда rating.php выполнится.
А мой вопрос остается в силе, как этот самый $list_id получить...
Не в сети
vitaly, is_array оставить конечно
Правда function ipcheck будет работать кривовато в итоге при таком подходе, на главной странице или в любом месте где выводится список новостей через news_showlist все будет ОК, а вот в полной новости список $list_id мы уже не будем иметь на руках. Так что нужно проверять еще в showNews если новость короткая, то есть $mode['style'] == 'short' , то использовать глобальный массив, который мы надеемся заполнен, а если полная ( $mode['style'] == 'full' ), то нужно делать другой запрос к таблице рейтига самостоятельно.
Не в сети
Раз никто не отвечает, вопрос задавал 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, ты мне объясни
Не в сети
Фильтр вешается на showNews, то есть когда рендерится новость. Ты в полную новость зайди и увидишь все, что нифига рейтинг твой работать не будет
Не в сети
Фильтр вешается на 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'
работает же
А в чем подвох тогда?
Не в сети
Не в сети
Я уже на подсознательном уровне выдаю правильные решения
Это твое подсознание выдало пост #76?! Мне бы так
А я сначала не стал лезть в news.php а потом уже пришлось, и все получилось
Теперь надо оптимизировать процесс голосования, записи информации в БД, сортировки по рейтингу, и т.д.
Мысли у меня есть по этому поводу...
Не в сети
Забежал чуть вперед, и сделал в конфиге выбор [IP+UserID+Cookie или UserID+Cookie или Только Cookie] пусть админ сам выбирает делать лишний запрос в БД или нет, и нужна-ли ему вообще защита от накруток, может кукисов будет достаточно, правда в rating.php еще не реализовал, но это будет не трудно сделать с помощью IF'ов ...
А я вот думаю, наверное еще стоит дать админу выбор, на какой промежуток времени ставить куки в браузер, и через какой промежуток времени стоит удалять голоса пользователей из БД - 1 месяц ... 1 год.
Правильно же? Мало-ли для каких целей может использоваться плагин и движок
Не в сети
Ага.. А как задать в конфиге плагина значение по умолчанию в выпадающем меню
<select>
<option>Пункт 1</option>
<option>Пункт 2</option>
<option>Пункт 3</option>
</select>
?
По умолчанию, после установки CMS и/или плагина, в extra_get_param($plugin,'PluginVarable') нули, и выбирается первый пункт меню<option>Пункт 1</option>, а как задать другое значение по умолчанию? Чтобы там был не "0", а например "3"?
Возможно такое сделать, или нет?
Если нет, то придется придумывать другое решение..
* пардон, не меню, а элементы списка
Изменено ikv777vlg (2011-10-21 08:24:53)
Не в сети
1. extra_get_param не нужно использовать, вместо него pluginGetVariable
2. С использованием тернарного оператора
pluginGetVariable($plugin, 'var') ? pluginGetVariable($plugin, 'var') : '3'
Не в сети
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]
На новую версию пока руки не доходят сайт перенести..
Не в сети
А сортировать новости по рейтингу вот так можно - "(rating / votes) desc"? Вроде сортирует...
А то я поначалу создавал дополнительное поле, куда записывал итоговый рейтинг, и сортировал по нему, а теперь думаю это поле убрать
Не в сети
Не в сети
Забавно... Я изменил конфиги и теперь из админки доступна сортировка новостей на главной по (rating / votes) desc и asc.
А вот мне интересно, сортировка новостей в категориях доступна по полю rating, а какой смысл по rating сортировать?
Ведь rating надо же на votes делить, и результат и будет рейтингом, положительным или отрицательным, и по нему сортировать.
Разве нет?
Изменено ikv777vlg (2011-10-21 22:26:03)
Не в сети