Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Тема закрыта
Никто не знает как сделать так чтобы модераторы не могли удалять или править посты сделанные админом?
Добавить проверку на group_id автора редактируемого или удаляемого поста
Спасибо за подсказку.
Но знания не хватает
Пока я только знаю что нужно как-то связать эти переменные:
if
$pun_user['g_id'] == PUN_ADMIN
$pun_user['g_id'] == PUN_MOD
message($lang_common['No permission']);
Можешь связать плз хотябы для запрета на удаление, на edit уже по аналогии можно?
Вот есть аналогия, но я не знаю как:
// Do we have permission to edit this post?
if (($pun_user['g_delete_posts'] == '0' ||
($pun_user['g_delete_topics'] == '0' && $is_topic_post) ||
$cur_post['poster_id'] != $pun_user['id'] ||
$cur_post['closed'] == '1') &&
!$is_admmod)
message($lang_common['No permission']);
попробуй добавить после последнего этот фрагмент:
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id']!== PUN_ADMIN)
message($lang_common['No permission']);
это в файле edit.php
еще надо подправить запрос в строке ~39 добавь после
fp.post_replies, fp.post_topics,
вот это
fp.group_id,
Редактировался hcs (2006-04-18 14:35:17)
попробуй добавить после последнего этот фрагмент:
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id']!== PUN_ADMIN) message($lang_common['No permission']);
Что-то не работает(((
Пробывал еще так делать:
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id'] != PUN_ADMIN)
message($lang_common['No permission']);
Тоже ничего. Переходит к форме удаления.
хм. group_id в forum_permission не одно и тоже с group_id в users
запрос надо модифицировать глубже, а именно отменить все изменения и делать так:
найти
fp.post_replies, fp.post_topics,
добавить после этого
u.group_id,
найти
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id
добавить после этого
LEFT JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
хм. group_id в forum_permission не одно и тоже с group_id в users
запрос надо модифицировать глубже, а именно отменить все изменения и делать так:
найти
Все работает)
Но есть один большой минус. Теперь сам админ не может отредактировать свои посты(
Еще не знаю куда поместить это
u.group_id,
сюда в файле moderate.php (там тоже оказывается можно удалять посты модерам):
// Fetch some info about the topic
$result = $db->query('SELECT t.subject, t.num_replies, f.id AS forum_id, forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_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 f.id='.$fid.' AND t.id='.$tid.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
помести после
t.subject,
кроме этого перед WHERE нужно добавить
LEFT JOIN '.$db->prefix.'users AS u ON u.id='.$pun_user['id'].'
почему же не редактируется самим админом???
Попробуй изменить условие на это:
if ($cur_post['group_id'] != $pun_user['group_id'])
message($lang_common['No permission']);
Не рулит. Теперь админ не может ничьи посты редактировать)
Ладно, все оказалось сложнее. И еще этот файл moderate.php там тоже хрен поймешь чего.
Ладно как-нибудь по другому придумаю.
Ну ладно, постараюсь попозже поставить чистый форум и разобраться.
Вобщем всё работает.
Изменения в edit.php
строка 39 ищем:
fp.post_replies, fp.post_topics,
добавляем после этого:
u.group_id,
в этой же строке ищем
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id
добавляем после этого:
LEFT JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
строка 59 ищем:
if (($pun_user['g_edit_posts'] == '0' ||
$cur_post['poster_id'] != $pun_user['id'] ||
$cur_post['closed'] == '1') &&
!$is_admmod)
message($lang_common['No permission']);
добавляем после этого:
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id']!= PUN_ADMIN)
message($lang_common['No permission']);
Изменения в delete.php аналогичны.
Проверено на чистом punbb работает как часы.
Спасибо работает! Но без редакции этого файла: moderate.php где тоже как оказалось модеры могут удалять это не имеет смыслы((( а там по аналогии не сделать(
В moderate.php модераторы могут удалять темы целиком, а не выборочно посты, разве не так?
Какой смысл оставлять целую тему из-за присутсвия в ней поста админа, если несмотря на это требуется тему таки удалить? Сделать это в принципе не сложнее чем правка и удаление отдельных постов, но я не думаю что это правильно и нужно
Попробуй в moderate.php так:
Добавить u.group_id сюда:
// Retrieve the posts (and their respective poster)
$result = $db->query('SELECT u.title, u.group_id, u.num_posts, g.g_id, g.g_user_title, p.id, p.poster, p.poster_id, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE p.topic_id='.$tid.' ORDER BY p.id LIMIT '.$start_from.','.$pun_user['disp_posts'], true) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
И после этого:
// Perform the main parsing of the message (BBCode, smilies, censor words
etc)
$cur_post['message'] = parse_message($cur_post['message'],
$cur_post['hide_smilies']);
Добавить это:
$lang_common['No permission'] = "В теме есть посты админа, поэтому удалять их может админ.";
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id'] != PUN_ADMIN)
message($lang_common['No permission']);
Вуаля, новый мод готов. Кто на панрес зальёт?
В moderate.php модераторы могут удалять темы целиком, а не выборочно посты, разве не так?
Какой смысл оставлять целую тему из-за присутсвия в ней поста админа, если несмотря на это требуется тему таки удалить? Сделать это в принципе не сложнее чем правка и удаление отдельных постов, но я не думаю что это правильно и нужно
Нужно чтобы эти темы с постами админов могли удалять только админы.
Если есть хотябы один пост админа нужно чтобы эта тема была неприкосновенна ни для кого кроме админа.
Вроде логично помоему. Никто не может удалять кроме админа. Нужно чтобы выводилась табличка что удалять ничего нельзя если есть посты админа. Это правильно. Будет соблюдена субординация) и мод будет законченный.
Нельзя ли все же доделать moderate.php?
А код Demo не решает задачу разве?
А код Demo не решает задачу разве?
В этом файле еще можно удалять темы из списка форумов. Зачем предохраняться от удаления постов если их можно целыми темами удалять(
Нужно чтобы вообще ничего что постил админ удалить было нельзя кроме него самого.
что делать если модер пытается удалить тему содержащую пост админа?
варианты:
1. вывести список тем, содержащих посты админа, с сообщением что операция не может быть выполнена
2. удалить все темы кроме содержащих посты админа, с информацией при редиректе (фактически втихую)
что делать если модер пытается удалить тему содержащую пост админа?
варианты:
1. вывести список тем, содержащих посты админа, с сообщением что операция не может быть выполнена
2. удалить все темы кроме содержащих посты админа, с информацией при редиректе (фактически втихую)
Первый вариант отличный. Это когда в списках тем форума.
И в самой теме еще нужно когда там галочками много постов отмечается также. Там тоже можно удалять.
Пока сделал запрет удаления тем содержащих посты админа, вариант 2.
файл moderate.php
ищем строки ~403
if (isset($_POST['delete_topics_comply']))
{
confirm_referrer('moderate.php');
if (preg_match('/[^0-9,]/', $topics))
message($lang_common['Bad request']);
добавляем после этого
$result = $db->query('SELECT t.subject, p.topic_id, u.group_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id WHERE topic_id IN('.$topics.')') or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());\
while ($cur_post = $db->fetch_assoc($result))
if ($cur_post['group_id'] == PUN_ADMIN && $pun_user['group_id']!= PUN_ADMIN) {
$denied_topics[]= $cur_post['topic_id'];
$denied_subj[]= $cur_post['subject'];
}
if (isset($denied_topics)) {
$test_topics=explode(",", $topics);
foreach ( $test_topics as $key => $value) {
foreach ( $denied_topics as $key2 => $value2) {
if ($value==$value2)
unset($test_topics[$key]);
}
}
if (count($test_topics)<1)
message("Выбранные темы не могут быть удалены, т.к. содержат сообщения администратора");
$topics=implode(',', $test_topics);
}
ищем ~460
redirect('viewforum.php?id='.$fid, $lang_misc['Delete topics redirect']);
добавляем перед этим следущее:
if (isset($denied_topics)) {
$msg[]="<p>Следующие темы не были удалены, т.к. содержат сообщения Администратора:</p>";
$msg[]="<ul>";
foreach ( $denied_topics as $key => $value) {
$msg[]="<li><a href='/viewtopic.php?id=".$value."'>".$denied_subj[$key] ."</a></li>";
}
$msg[]="</ul>";
$msg=implode("\n", $msg);
message($msg);
}
Ну спасиба! Теперь на пунрез...)
Страницы 1
Тема закрыта