1

Тема: Запретить удаление.

Никто не знает как сделать так чтобы модераторы не могли удалять или править посты сделанные админом?

Поделиться

2

Re: Запретить удаление.

Добавить проверку на group_id автора редактируемого или удаляемого поста

Сайт hcs

Поделиться

3

Re: Запретить удаление.

Спасибо за подсказку.
Но знания не хватает sad

Пока я только знаю что нужно как-то связать эти переменные:

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']);

Поделиться

4 (18.04.2006 03:35 отредактировано hcs)

Re: Запретить удаление.

попробуй добавить после последнего этот фрагмент:

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

Поделиться

5

Re: Запретить удаление.

hcs пишет:

попробуй добавить после последнего этот фрагмент:

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']);

Тоже ничего. Переходит к форме удаления.

Поделиться

6

Re: Запретить удаление.

хм.  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

Сайт hcs

Поделиться

7

Re: Запретить удаление.

hcs пишет:

хм.  group_id в forum_permission не одно и тоже с group_id в users
запрос надо модифицировать глубже, а именно отменить все изменения и делать так:
найти

Все работает)
Но есть один большой минус. Теперь сам админ не может отредактировать свои посты(

Поделиться

8

Re: Запретить удаление.

Еще не знаю куда поместить это

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());

Поделиться

9

Re: Запретить удаление.

помести после

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']);

Сайт hcs

Поделиться

10

Re: Запретить удаление.

Не рулит. Теперь админ не может ничьи посты редактировать)
Ладно, все оказалось сложнее. И еще этот файл moderate.php там тоже хрен поймешь чего.
Ладно как-нибудь по другому придумаю.

Поделиться

11

Re: Запретить удаление.

smile Ну ладно, постараюсь попозже поставить чистый форум и разобраться.

Сайт hcs

Поделиться

12

Re: Запретить удаление.

Вобщем всё работает.
Изменения в 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 работает как часы.

Сайт hcs

Поделиться

13

Re: Запретить удаление.

Спасибо работает! Но без редакции этого файла: moderate.php где тоже как оказалось модеры могут удалять это не имеет смыслы((( а там по аналогии не сделать(

Поделиться

14

Re: Запретить удаление.

В moderate.php модераторы могут удалять темы целиком, а не выборочно посты, разве не так?
Какой смысл оставлять целую тему из-за присутсвия в ней поста админа, если несмотря на это требуется тему таки удалить? Сделать это в принципе не сложнее чем правка и удаление отдельных постов, но я не думаю что это правильно и нужно

Сайт hcs

Поделиться

15

Re: Запретить удаление.

Попробуй в 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']);
ERROR - MIRROR

Поделиться

16

Re: Запретить удаление.

Вуаля, новый мод готов. Кто на панрес зальёт? smile

Сайт hcs

Поделиться

17

Re: Запретить удаление.

hcs пишет:

В moderate.php модераторы могут удалять темы целиком, а не выборочно посты, разве не так?
Какой смысл оставлять целую тему из-за присутсвия в ней поста админа, если несмотря на это требуется тему таки удалить? Сделать это в принципе не сложнее чем правка и удаление отдельных постов, но я не думаю что это правильно и нужно

Нужно чтобы эти темы с постами админов могли удалять только админы.
Если есть хотябы один пост админа нужно чтобы эта тема была неприкосновенна ни для кого кроме админа.
Вроде логично помоему. Никто не может удалять кроме админа. Нужно чтобы выводилась табличка что удалять ничего нельзя если есть посты админа. Это правильно. Будет соблюдена субординация) и мод будет законченный.
Нельзя ли все же доделать moderate.php?

Поделиться

18

Re: Запретить удаление.

А код Demo не решает задачу разве?

Сайт hcs

Поделиться

19

Re: Запретить удаление.

hcs пишет:

А код Demo не решает задачу разве?

В этом файле еще можно удалять темы из списка форумов. Зачем предохраняться от удаления постов если их можно целыми темами удалять(
Нужно чтобы вообще ничего что постил админ удалить было нельзя кроме него самого.

Поделиться

20

Re: Запретить удаление.

что делать если модер пытается удалить тему содержащую пост админа?
варианты:
1. вывести список тем, содержащих посты админа, с сообщением что операция не может быть выполнена
2. удалить все темы кроме содержащих посты админа, с информацией при редиректе (фактически втихую)

Сайт hcs

Поделиться

21

Re: Запретить удаление.

hcs пишет:

что делать если модер пытается удалить тему содержащую пост админа?
варианты:
1. вывести список тем, содержащих посты админа, с сообщением что операция не может быть выполнена
2. удалить все темы кроме содержащих посты админа, с информацией при редиректе (фактически втихую)

Первый вариант отличный. Это когда в списках тем форума.
И в самой теме еще нужно когда там галочками много постов отмечается также. Там тоже можно удалять.

Поделиться

22

Re: Запретить удаление.

Пока сделал запрет удаления тем содержащих посты админа, вариант 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

Поделиться

23

Re: Запретить удаление.

Ну спасиба! Теперь на пунрез...)

Поделиться

24

Re: Запретить удаление.

hcs
Большое спасибо за модификацию! В теме присутствуют мелкое ошибки, но покопавшись как следует их можно исправить. Но самое главное, хотелось бы довести мод до конца - в данном варианте если модератор удаляет первый пост темы, и этот пост - не администратора, то тема удаляется даже если в ней есть посты администратора. Сам пробовал исправить, но увы - огромное количество времени, потраченного впустую... Добавьте пожалуйста данную функцию smile Спасибо!

Поделиться