theIggs Опубликовано 6 Февраля 2004 Жалоба Поделиться Опубликовано 6 Февраля 2004 Все, надеюсь, знают, что в Invision Power Board'e, как и во многих других форумах, у каждого пользователя есть счётчик постов. Каждый раз, когда пользователь отправляет сообщение в форум, его счётчик увеличивается на единицу.В IPB есть стандартная возможность отключить счётчик постов в отдельных форумах ( Админцентр -> Forum Control (Настройки форумов) -> Manage Forums (Управление форумами), Settings (Настройки), Posts in this forum increase member's cumulative post count? (Включить счётчик сообщений в этом форуме?) = Нет.После удаления постов модераторами число сообщений у пользователя не изменяется. Таким образом, счётчик - один из самых главных показателей активности пользователя на форуме. petrosjn отреагировал на это 1 Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 6 Февраля 2004 Автор Жалоба Поделиться Опубликовано 6 Февраля 2004 Сейчас мы будем немного изменять работу счётчика. Согласитесь, иногда раздражает, что разного рода флудеры незаслуженно торчат в статистике среди первых. Сделаем так, что после удаления постов модераторами счётчик сообщений у пользователя будет уменьшаться. 1. Уменьшение счётчика постов после удаления отдельных постов.Открыть sources/Moderate.php. Найти:$DB->query("UPDATE ibf_stats SET TOTAL_REPLIES=TOTAL_REPLIES-1");Ниже добавить: if ($this->forum['inc_postcount']) { $DB->query("UPDATE ibf_members SET posts=posts-1 WHERE id='".$post['author_id']."'"); }Должно работать на всех версиях IPB.Оригинальный мод тут: http://www.ibresource.ru/db/?mod=59 2. Уменьшение счётчика сообщений после удаления тем.ВНИМАНИЕ! Не используйте этот вариант - используйте лучше вариант из сообщения: Счётчик сообщений пользователяОткрыть sources/lib/modfunctions.php. Найти: $DB->query("DELETE FROM ibf_topics WHERE tid".$tid); Заменить на: $DB->query("SELECT t.tid FROM ibf_topics t, ibf_forums f WHERE t.forum_id = f.id AND f.inc_postcount != 1 AND t.tid".$tid); $exclude_topics = ''; while ($row = $DB->fetch_row() ) { $exclude_topics .= $row['tid'].','; } $exclude_topics = substr($exclude_topics, 0, strlen($exclude_topics)-1); if ($exclude_topics != '') $extra = "NOT (topic_id IN ($exclude_topics)) AND"; $DB->query("DELETE FROM ibf_topics WHERE tid".$tid); $DB->query("SELECT author_id FROM ibf_posts WHERE $extra topic_id".$tid); $postz = array(); while ($row = $DB->fetch_row() ) { $postz[ $row['author_id'] ] ++; } foreach ($postz as $id => $count) { $DB->query("UPDATE ibf_members SET posts = posts - $count WHERE id='$id'"); }С версиями 1.1.х работать не будет, там система немного другая. Если вдруг кому-то понадобится, напишите здесь. Хотя прежде всего - обновляться надо, товарищи!Связанная тема тут: Проблема с счетчиком сообщений. Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 6 Февраля 2004 Автор Жалоба Поделиться Опубликовано 6 Февраля 2004 Теперь добавим механизм пересчёта постов тех пользователей, которые уже успели зафлудить форум, но остались безнаказанными. В Админцентре -> Administration (Администрирование) -> Recount Statistics (Пересчёт статистики) есть настройка для пересчёта количества тем и сообщений, но она пересчитывает только общее число постов и тем на форуме.Добавим туда же настройку, которая произведёт пересчёт постов всех пользователей в соответствии с реальной ситуацией. Открыть sources/sources/Admin/ad_settings.php. Найти: $ADMIN->html .= $SKIN->add_td_row( array( "Recount total topics and posts", $SKIN->form_dropdown( 'posts', array( 0 => array( 1, 'Yes' ), 1 => array( 0, 'No' ) ) ) ) );Внимание! Если у вас установлен русифицированный Админцентр, ищите по тем строчкам, которые не содержат русских символов, и всё будет пучком. Ниже добавить: $ADMIN->html .= $SKIN->add_td_row( array( "Пересчитать посты всех пользователей?", $SKIN->form_dropdown( 'allposts', array( 0 => array( 0, 'Нет' ), 1 => array( 1, 'Да' ) ) ) ) ); Найти:$stats = array(); Ниже добавить: if ($IN['allposts']) { $DB->query("SELECT id, posts FROM ibf_members WHERE 1"); $oldpostz = array(); while ($row = $DB->fetch_row()) $oldpostz[ $row['id'] ] = $row['posts']; $DB->query("SELECT author_id, COUNT(author_id) AS theposts FROM ibf_posts WHERE 1 GROUP BY author_id"); $postz = array(); while ($row = $DB->fetch_row()) $postz[ $row['author_id'] ] = $row['theposts']; $DB->query("SELECT p.author_id, COUNT(p.author_id) AS minusposts FROM ibf_posts p, ibf_forums f WHERE (p.forum_id = f.id AND f.inc_postcount = 0) GROUP BY p.author_id"); while ($row = $DB->fetch_row()) $postz[ $row['author_id'] ] -= $row['minusposts']; foreach ($oldpostz as $id => $count) { if (!$postz[ $id ]) {$postz[ $id ]=0;} if ($postz[ $id ] != $oldpostz[ $id ]) $DB->query("UPDATE ibf_members SET posts = {$postz[ $id ]} WHERE id = '$id'"); } } В разделе Пересчёт статистики теперь наблюдаем новый пункт - Пересчитать посты всех пользователей. Спасибо ZiLot за помощь в отладке. Ссылка на комментарий Поделиться на других сайтах Прочее
Остап Опубликовано 6 Февраля 2004 Жалоба Поделиться Опубликовано 6 Февраля 2004 (изменено) theIggs Один манюсенький вопрос. Вернее два. 1. Работает ли всё тобой описанное выше ПРАВИЛЬНО в тех форумах, где счётчик постов ОТКЛЮЧЁН ? Поясню : например юзер запостил на таком форуме. Счётчик не сработал, правильно ? Тут злой модер удаляет данный пост. А вот и сам вопрос : не обминусится ли в этом случае счётчик данного юзера ? ( если да, то что можно сделать )Исправлено, теперь должно работать. 2. Если на форуме ПОЗВОЛЕНО самим пользователям удалять СВОИ СООБЩЕНИЯ и/или ТЕМЫ, в данном случае будет ли работать всё, описанное тобой выше ??? ( если нет, то что можно сделать )Всё будет работать, ведь в любом случае удаление идёт через одни и те же функции. Спасибо.Пожалуйста. Тебе спасибо за замечания в тему! Изменено 8 Февраля 2004 пользователем theIggs Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 8 Февраля 2004 Автор Жалоба Поделиться Опубликовано 8 Февраля 2004 На всякий случай добавим возможность пересчёта постов отдельных пользователей (вдруг общий сброс счётчиков не требуется?). Открываем sources/Admin/ad_member.php.Найдём: $ADMIN->html .= $SKIN->add_td_row( array( "<b>Post Count</b>" , $SKIN->form_input("posts", $mem['posts']) ) ); Ниже добавим: $ADMIN->html .= $SKIN->add_td_row( array( "<b>Пересчитать посты этого пользователя?</b>" , $SKIN->form_yes_no("posts_recount", 0) ) ); Найдём: $restrict_post = 0; ВЫШЕ добавим: if ($IN['posts_recount']) { $DB->query("SELECT COUNT(p.pid) AS postz FROM ibf_posts p, ibf_forums f WHERE (p.forum_id = f.id AND f.inc_postcount = 1) AND p.author_id = '".$IN['mid']."'"); $row = $DB->fetch_row(); $IN['posts'] = $row['postz']; } Теперь в форме редактирования пользователя (Админцентр -> Users & Groups -> Find / Edit / Suspend User) сразу после текущего числа сообщений пользователя добавится настройка Пересчитать посты этого пользователя? Ссылка на комментарий Поделиться на других сайтах Прочее
Evgheni Опубликовано 4 Марта 2004 Жалоба Поделиться Опубликовано 4 Марта 2004 Скажите плз., а пересчет сообщений нормально ладит с форумами, где в некоторых разделах отключен счетчик сообщений? Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 4 Марта 2004 Автор Жалоба Поделиться Опубликовано 4 Марта 2004 Всё вроде нормально работает. Если обнаружишь глюки - пиши о них тут, исправим. Ссылка на комментарий Поделиться на других сайтах Прочее
Evgheni Опубликовано 5 Марта 2004 Жалоба Поделиться Опубликовано 5 Марта 2004 Работает хорошо.Вернулся от свего имени выразить глубокое уважение Thx пацаны. Ссылка на комментарий Поделиться на других сайтах Прочее
David Опубликовано 30 Апреля 2004 Жалоба Поделиться Опубликовано 30 Апреля 2004 Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 30 Апреля 2004 Жалоба Поделиться Опубликовано 30 Апреля 2004 Уменьшение счётчика сообщений после удаления тем.Чего-то ты здесь наворотил..Вот так ИМХО оно более компактно и логично: $DB->query("DELETE FROM ibf_topics WHERE tid".$tid); $DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid. " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0"); if ( $DB->get_num_rows() ) { $ids = array(); while ($row = $DB->fetch_row() ) $ids[ $row['author_id'] ] ++; foreach ($ids as $mid => $count) $DB->query("UPDATE ibf_members SET posts=posts-$count WHERE id='".$mid."'"); } Ссылка на комментарий Поделиться на других сайтах Прочее
Bebson Опубликовано 13 Мая 2004 Жалоба Поделиться Опубликовано 13 Мая 2004 Song А вот эта строчка как правильно выглядит? Так - $DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid. " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0"); или так, в одну строку? $DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid. " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0"); Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 13 Мая 2004 Жалоба Поделиться Опубликовано 13 Мая 2004 Bebson без разницы хоть по одному слову в столибик. PHP пофик. Ссылка на комментарий Поделиться на других сайтах Прочее
Bebson Опубликовано 17 Мая 2004 Жалоба Поделиться Опубликовано 17 Мая 2004 После установки всего вышеперечисленного, пересчёт прошёл отлично.Только вот глючок вылез. Хотелось бы знать, сталкивался ли кто и как лечилось. Модеры, супермодеры и админы удаляют и переносят (с удалением на старом месте) темы. Внешне всё как положено - подтверждение удаления, редирект с извещением об удалении, только тема остаётся на своём месте. Удаляются только сообщения внутри темы. А саму тему можно завалить только напрямую через БД, блин Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 17 Мая 2004 Жалоба Поделиться Опубликовано 17 Мая 2004 $DB->query("DELETE FROM ibf_topics WHERE tid".$tid); забыл ? Ссылка на комментарий Поделиться на других сайтах Прочее
Bebson Опубликовано 19 Мая 2004 Жалоба Поделиться Опубликовано 19 Мая 2004 Song Ну, это почти тоже самое, только вид сбоку - через АЦ. Вмешиваться ведь приходится самому Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 19 Мая 2004 Жалоба Поделиться Опубликовано 19 Мая 2004 Bebson да нет! забыл в в modfunctions.php вставить! Ссылка на комментарий Поделиться на других сайтах Прочее
Bebson Опубликовано 21 Мая 2004 Жалоба Поделиться Опубликовано 21 Мая 2004 Блин! Я с ходу подумал, мне предлагают через mysql tools в АЦ удалять эти топики...Верно, при замене кода данную строчку я убил. Теперь всё ОК! Спасибо за подсказку! Ссылка на комментарий Поделиться на других сайтах Прочее
arni729 Опубликовано 21 Мая 2004 Жалоба Поделиться Опубликовано 21 Мая 2004 Вопрос Если есть форум в котором сообщения не засчитываются (условно Форум Х), то пересчитываемое количество сообщений не должно включать те сообщения которые в Форуме Х. Это учитывается?Было бы хорошо, если бы при переносе темы в ФОрум Х у авторов сообщений отнималось кол-во сообщений, опубликованных в переносимой теме. Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 21 Мая 2004 Жалоба Поделиться Опубликовано 21 Мая 2004 Это учитывается?Учитывается.Было бы хорошо, если бы при переносе темы в ФОрум Х у авторов сообщений отнималось кол-во сообщений, опубликованных в переносимой теме.Зачем? Ссылка на комментарий Поделиться на других сайтах Прочее
arni729 Опубликовано 21 Мая 2004 Жалоба Поделиться Опубликовано 21 Мая 2004 Учитывается.Ok. Зачем?Ну, раз сообщения в форуме Х признаются "неполезными", то какая разница были они там изначально или были перенесены туда? Имхо, следовало бы отнимать. Добавлено в [mergetime]1085170088[/mergetime] ИМХО функция полезная, может народные умельцы подумают над этим? Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 28 Мая 2004 Жалоба Поделиться Опубликовано 28 Мая 2004 Это нельзя сделать т.к. сообщения в тему могли попасть как угодно: начиная от перемещения и заканчивая разделением. А у сообщений нет признака что ни перемещены и тем более того где они были раньше. Самое большее у топика. Можно конечно смотреть нет ли линка на перемещения от топика, к которому они принадлежат, но это получится довольно тормозно. А линки можно не ставить при перемещении. Так что в общем случае твоя проблема стандартными полями не решается, а в частном - можно, но довольно криво. Ссылка на комментарий Поделиться на других сайтах Прочее
Dimitron0077 Опубликовано 1 Июля 2004 Жалоба Поделиться Опубликовано 1 Июля 2004 Вопрос у меня на форуме: если например я только только зделал *форум* в админке и в настройках отменил счетчик сообшений то у пользователя почемутопосле добавления сообшения в даный форум не отображаетса в обшее количество его сообшенийтоесть до добавления у него было всего 0 сообшений после добавления в выше написаный форум у него вместо 1 сообшения - осталось 0 ето так должно быть и исправляет хак ету функцию Ссылка на комментарий Поделиться на других сайтах Прочее
SHiSH Опубликовано 5 Июля 2004 Жалоба Поделиться Опубликовано 5 Июля 2004 отменил счетчик сообшенийтыж счётчик сообщений отменил Ссылка на комментарий Поделиться на других сайтах Прочее
orc Опубликовано 23 Июля 2004 Жалоба Поделиться Опубликовано 23 Июля 2004 Помогите пожалуйса мне.Мне нужно 2 счетчика сообщений, один который всегда есть, т.е считает все сообщения в любых темах, и 2-ой который считал бы только в определенных разделах? И чтобы потом втрой можно было обнулить. В адинку можно ограничить число разделов, но как зделать 2-ю строчку сообщений???? Должно находиться под "датой регистрации" Ссылка на комментарий Поделиться на других сайтах Прочее
Meowth[OGD] Опубликовано 23 Июля 2004 Жалоба Поделиться Опубликовано 23 Июля 2004 Тебе нужно создать новое поле в таблице ibf_forums чтобы отмечать там элитные форума и поле в таблице ibf_members и смотреть файлы sources/lib/post_******.php на предмет того в каких строчках увеличивается число сообщений. Делать выборку валидности форумов твоему новому полю и в зависимости от результата увеличивать число. А вывод в топик по аналогии с теми же постами Topics.php и skin_topic.php Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения