Тема: Запретить удаление.
Никто не знает как сделать так чтобы модераторы не могли удалять или править посты сделанные админом?
|
Фонд моральной поддержки |
|
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
PunBB по-русски → Вопросы и ответы → Запретить удаление.
Страницы 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,попробуй добавить после последнего этот фрагмент:
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 не решает задачу разве?
В этом файле еще можно удалять темы из списка форумов. Зачем предохраняться от удаления постов если их можно целыми темами удалять(
Нужно чтобы вообще ничего что постил админ удалить было нельзя кроме него самого.
что делать если модер пытается удалить тему содержащую пост админа?
варианты:
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);
}hcs
Большое спасибо за модификацию! В теме присутствуют мелкое ошибки, но покопавшись как следует их можно исправить. Но самое главное, хотелось бы довести мод до конца - в данном варианте если модератор удаляет первый пост темы, и этот пост - не администратора, то тема удаляется даже если в ней есть посты администратора. Сам пробовал исправить, но увы - огромное количество времени, потраченного впустую... Добавьте пожалуйста данную функцию
Спасибо!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
PunBB по-русски → Вопросы и ответы → Запретить удаление.
Сгенерировано за 0.146 секунды (55% PHP — 45% БД) 11 запросов к базе данных
Технологии с открытым исходным кодом, несомненно, обладают серьезным преимуществом над аналогичными продуктами, распространяемыми по ограниченным лицензиям. И совершенно неважно, что это. Возможно это:
Впрочем, неважно. Что бы это ни было, важно всячески поощрять и поддерживать Open Source в любом виде. Тем более, что вы знаете, PunBB распространяется по лицензии GPL/GNU. И спасибо за внимание.