Быстрый лёгкий надёжный форумный движок
Вы не вошли.
это позволяет не учитывать сообщения не в разделах , а только в топиках. в данном случае в топике под номером в базе 123...
Ну так если добавить все другие нумерации, которые хрантся в другой таблице не в posts а в topics, то будет именно то.
у разделов совсем другая нумерация, и хранится в другой таблице не в posts а в topics. так что поправьте!
ну так база данных то одна? И форум тоже как бы один? Значит и нумерации должны быть также одни...
неа, если у раздела №6, то в ходе этого скрипта мы блокируем счетчик не в разделе 6, а в форуме №6... а как сделать это все на раздел, я не знаю... так как в РНР слабоват... савсем
так как в РНР слабоват... савсем
но несмотря на это, кто-то тут тебе должен что-то поправить...
а как сделать это все на раздел
в начале post.php есть:
if ($tid)
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.post_polls, t.subject, t.closed, t.question, t.last_post, t.last_post_id, t.last_poster, t.num_replies FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
else
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.post_polls FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
если заменить
if ($tid)
$result = $db->query('SELECT f.cat_id, f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.post_polls, t.subject, t.closed, t.question, t.last_post, t.last_post_id, t.last_poster, t.num_replies FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
else
$result = $db->query('SELECT f.cat_id, f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.post_polls FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
То мы получим в $cur_posting['cat_id'] ид категории содержащий данный форум.
Такая поправка устроит или что-нибудь еще поправить?
поправил, как было написано... и добавил
// If the posting user is logged in, increment his/her post count
if (!$pun_user['is_guest'] && $cur_posting['cat_id']!=4)
{
$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
}
однако получил:
An error was encountered
File: z:\home\test1.ru\www\post.php
Line: 42
PunBB reported: Unable to fetch forum info
Database reported: Unknown column 'fp.post_polls' in 'field list' (Errno: 1054)
Редактировался Homolibere (2007-02-26 00:09:26)
Ладно, проехали.
Просто добавляешь после SELECT в обоих запросах f.cat_id,
все заработало, спасибо.... просто лоханулся и указал вместо номера категории, номер форума... огромное спасибо!
Предлагаю МОД: Не считать сообщения в определенных форумах
v 1.0
1. Выполнить в плагине DB management или phpMyAdmin (заменив #__ префиксом Вашей базы).
ALTER TABLE #__forums ADD `no_sum_mess` tinyint(1) NOT NULL default '0'
2. Открыть файл admin_forums.php (правим для того, чтобы через админку задавать для форумов считать/не считать посты)
3. Найти (примероно 230 строка)
// Fetch forum info
$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
Заменить на
// Fetch forum info
$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id, no_sum_mess FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
4. Найти (примерно 288 строка)
<tr>
<th scope="row">URL переадресации</th>
<td><?php echo ($cur_forum['num_topics']) ? 'Доступно только для пустых форумов' : '<input type="text" name="redirect_url" size="45" maxlength="100" value="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" tabindex="5" />'; ?></td>
</tr>
После добавить это
<tr>
<th scope="row">Сообщения не засчитываются</th>
<td><input type="checkbox" name="no_sum_message" value="1"<?php echo ($cur_forum['no_sum_mess']) ? ' checked="checked"' : ''; ?> /></td>
</tr>
5. Найти (примерно 165 строка)
// Start with the forum details
$forum_name = trim($_POST['forum_name']);
$forum_desc = pun_linebreaks(trim($_POST['forum_desc']));
$cat_id = intval($_POST['cat_id']);
$sort_by = intval($_POST['sort_by']);
$redirect_url = isset($_POST['redirect_url']) ? trim($_POST['redirect_url']) : null;
После добавить это
$no_sum_message = isset($_POST['no_sum_message']) ? intval($_POST['no_sum_message']) : 0;
if ($no_sum_message != 1) $no_sum_message = 0;
6. Найти (примерно строка 183)
$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id.' WHERE id='.$forum_id) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
Заменить на
$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id.', no_sum_mess='.$no_sum_message.' WHERE id='.$forum_id) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
7. Сохранить файл admin_forums.php
8. Открыть AP_Forum_cleanup.php (это плагин которым можно поправить кол-во постов у каждого пользователя)
9. Найти (примерно 75 строка).
// synchronise user posts
$db->query('CREATE TEMPORARY TABLE IF NOT EXISTS '.$db->prefix.'user_posts SELECT poster_id, count(*)as posts FROM '.$db->prefix.'posts GROUP BY poster_id') or error('Creating posts table failed', __FILE__, __LINE__, $db->error());
Заменить на
// synchronise user posts
$db->query('CREATE TEMPORARY TABLE IF NOT EXISTS '.$db->prefix.'user_posts SELECT poster_id, count(f.no_sum_mess)as posts FROM '.$db->prefix.'posts AS p left JOIN '.$db->prefix.'topics as t, '.$db->prefix.'forums as f ON (f.no_sum_mess=0 and f.id=t.forum_id) WHERE p.topic_id=t.id GROUP BY p.poster_id') or error('Creating posts table failed', __FILE__, __LINE__, $db->error());
Запрос работает, но надо проверить его логическую структуру, т.к. я не понял как JOIN работает.
10.Сохранить AP_Forum_cleanup.php
11.Открыть post.php
12.Найти (примерно 40 строка)
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
Заменить на
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, f.no_sum_mess FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
Если стоит PMS, то рядом в условие надо добавить: , f.no_sum_mess
13.Найти (примерно 370 строка)
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
Заменить на
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET '.(($cur_posting['no_sum_mess'] == 0) ? 'num_posts=num_posts+1, ' : '').'last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
14.Сохранить post.php
А можно прикрутить, не к "AP_Forum_cleanup.php", а к "AP_Author_Update.php"?
а причем тут автор апдейт? вроде ж разные совершенно моды
А можно прикрутить, не к "AP_Forum_cleanup.php", а к "AP_Author_Update.php"?
Вечером гляну что можно сделать
Продолжение мода для плагина Author Update (затрагивает кнопку Синхронизировать)
15.Открыть AP_Author_Update.php
16.Найти
// Synchronize user post counts
$db->query('CREATE TEMPORARY TABLE IF NOT EXISTS '.$db->prefix.'post_counts SELECT poster_id, count(*) as new_num FROM '.$db->prefix.'posts GROUP BY poster_id') or error('Creating temporary table failed', __FILE__, __LINE__, $db->error());
Заменить на
// Synchronize user post counts
$db->query('CREATE TEMPORARY TABLE IF NOT EXISTS '.$db->prefix.'post_counts SELECT poster_id, count(*) as new_num FROM '.$db->prefix.'posts AS p, '.$db->prefix.'topics as t, '.$db->prefix.'forums as f WHERE f.no_sum_mess=0 and f.id=t.forum_id and p.topic_id=t.id GROUP BY p.poster_id') or error('Creating temporary table failed', __FILE__, __LINE__, $db->error());
17.Сохранить AP_Author_Update.php
Если префикса нет, то значит:
ALTER TABLE forums ADD `no_sum_mess` tinyint(1) NOT NULL default '0'
?
Visman, СПАСИБО!
Если префикса нет, то значит: КОД
Да, так и есть.
Visman, СПАСИБО!
Не за что
Если префикса нет, то значит:
ALTER TABLE forums ADD `no_sum_mess` tinyint(1) NOT NULL default '0'
?
Visman, СПАСИБО!
йоптить, нету у меня такой строки в AP_DB_management.php
ткните носом, где я туплю?:/
ткните носом, где я туплю?
ALTER TABLE #__forums ADD `no_sum_mess` tinyint(1) NOT NULL default '0'
эту команду надо выполнить в плагине DB management, а не вставлять в код плагина!
З.Ы. Команда создает поле no_sum_mess в таблице #__forums.
МОД: Не считать сообщения в определенных форумах v 1.0
При выполнении 8 9 10 пункта и после нажатия в админке Synchronise user post counts > Go! выдает:
File: /usr/local/www/apache22/data/plugins/AP_Forum_cleanup.php
Line: 76
PunBB reported: Creating posts table failed
Database reported: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' pun_forums as f ON (f.no_sum_mess=0 and f.id=t.forum_id) WHERE p.topic_id=t.id' at line 1 (Errno: 1064)
Failed query: CREATE TEMPORARY TABLE IF NOT EXISTS pun_user_posts SELECT poster_id, count(f.no_sum_mess)as posts FROM pun_posts AS p left JOIN pun_topics as t, pun_forums as f ON (f.no_sum_mess=0 and f.id=t.forum_id) WHERE p.topic_id=t.id GROUP BY p.poster_id
Плагин с сайта там всего 1 строку заменить - непересчитывает вобщем, дохнет(
А правка http://punbb.ru/viewtopic.php?pid=15810#p15810 плагина Author Update - v2.1 работает.. странно
И по 12 пункту, я добавлял , f.no_sum_mess не в указаную строку
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
А в ту что выше(я написал ее ниже)), иначе посткаунт увеличивался и нифига не получалось
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.subject, t.closed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
Может и я чет не так делаю?
Редактировался Dayset (2008-05-12 06:33:53)
При выполнении 8 9 10 пункта и после нажатия в админке Synchronise user post counts > Go! выдает:
Попробуй заменить в 9 пункте на это:
// synchronise user posts
$db->query('CREATE TEMPORARY TABLE IF NOT EXISTS '.$db->prefix.'user_posts SELECT poster_id, count(f.no_sum_mess)as posts FROM '.$db->prefix.'posts AS p, '.$db->prefix.'topics as t, '.$db->prefix.'forums as f WHERE f.no_sum_mess=0 and f.id=t.forum_id and p.topic_id=t.id GROUP BY p.poster_id') or error('Creating posts table failed', __FILE__, __LINE__, $db->error());
Тут запрос без LEFT JOIN.
А это строки 39-47 из post.php (там MOD Merge Post свои изменения вносит, так что я написал выше, что надо в оба запроса добалять , f.no_sum_mess. Но наверное коряво написал, раз не понятно
// Fetch some info about the topic and/or the forum
if ($tid)
// START Mod title: Merge Post
// ADD ,p.id AS post_id, p.poster_id, p.message, p.posted
// ADD LEFT JOIN '.$db->prefix.'posts AS p ON (t.last_post_id=p.id AND p.poster_id='.$pun_user['id'].')
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.subject, t.closed, p.id AS post_id, p.poster_id, p.message, p.posted, f.no_sum_mess FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'posts AS p ON (t.last_post_id=p.id AND p.poster_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
// END Mod title: Merge Post
else
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, f.no_sum_mess FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
Спасибо, работает. У меня нет Merge Post
AP_Forum_cleanup.php теперь тоже считает правильно...