Главная » Функционал » Нестандартные решения » Премодерация сообщений на форуме

Премодерация сообщений на форуме

13.01.2013 в 13:22
Автор: Вансан

Здравствуйте, меня зовут Иван, и в этой статье я расскажу Вам о том, как можно сделать премодерацию сообщений на форуме. Премодерация сообщений форума - задача довольно экзотическая и редко востребованная. Но, тем не менее, иногда эта функция может понадобиться.

Для начала опишем постановку задачи.
Имеется группа пользователей (далее "Пользователи"), сообщения от которой необходимо премодерировать.
Делать это должны, скажем, только администраторы и модераторы (далее просто модераторы).
При этом никто, кроме модераторов, не должен видеть сообщение до его активации (даже посмотрев исходный код страницы).
Если пользователя переводят в другую группу, все его сообщения должны быть активированы автоматически.

Теория

Суть идеи заключается в следующем: нам нужно использовать некий флажок, который будет отвечать за то, показывать ли сообщение, или нет.
В качестве этого флажка мы будем использовать поле EDITEDBY, если EDITEDBY есть - значит сообщение активировано, и его можно показывать всем, иначе наоборот.

Разумеется, это накладывает дополнительные ограничения, а именно:
  • "Пользователи" не должны редактировать свои сообщения [1];
  • модераторы должны уметь редактировать чужие сообщения;
  • так как в поле EDITEDBY будет записываться ник модератора, то показывать значение этого поля лучше только самим модераторам [1].

Исходя из вышеизложенного, алгоритм проверки сообщения достаточно прост (см. схему).



Так как реализация содержит в себе условные коды, сразу оговоримся, что:
  • для группы "Администраторы" $GROUP_ID$ равен 4;
  • для группы "Модераторы" $GROUP_ID$ равен 3;
  • для группы "Пользователи" $GROUP_ID$ равен 1.


Реализация

Шаг 1 - Установка прав

Основное ограничение для "Пользователей" - они не должны уметь редактировать свои сообщения.
Для этого в админке, в разделе установки прав для группы "Пользователи", снимаем (если она установлена) галочку "Редактировать свои сообщения", и нажимаем "Сохранить".




Аналогично устанавливаем права для группы модераторов (ставим галочку "Редактировать все сообщения"), и нажимаем "Сохранить".
Остальные настройки остаются на ваше усмотрение.

Шаг 2 - Изменение формы редактирования

Данный шаг не является обязательным, и носит исключительно косметический характер.

Здесь мы изменим стандартный текст "Добавить надпись 'Отредактировано...' в это сообщение?" на "Активировать сообщение?".
В шаблоне формы нет кода $GROUP_ID$, то-есть нельзя так просто узнать группу пользователя, написавшего сообщение.
Поэтому текст "Активировать сообщение?" будет показываться при редактировании любого сообщения.

Если ваших модераторов этот небольшой баг будет сильно смущать - можете пропустить этот шаг и не заменять стандартную надпись.

Итак, открываем: Управление дизайном » Редактирование шаблонов » Форум » Форма добавления сообщения.
Находим код стандартной надписи, выглядит он примерно так:

Код
<?if($_EDITED_OPT$)?>$_EDITED_OPT$ <label for="edited">Добавить надпись "Отредактировано..." в это сообщение?</label><?endif?>


После чего заменяем текст "Добавить надпись 'Отредактировано...' в это сообщение?" на "Активировать сообщение?".

Код
<?if($_EDITED_OPT$)?>$_EDITED_OPT$ <label for="edited">Активировать сообщение?</label><?endif?>


Выглядеть это будет примерно так:



Шаг 3 - Скрипт

Как уже было сказано ранее, процесс активации / деактивации сообщения заключается, по сути, в редактировании сообщения с установленным / снятым флажком EDITEDBY. Процесс это довольно рутинный, поэтому для удобства мы сделаем кнопку активации / деактивации, для работы которой нужен небольшой скрипт.

Итак, нужно загрузить скрипт на сайт. Откройте файловый менеджер, и добавьте в корень сайта папку js. Затем в эту папку загрузите файл msg_premod.min.js (См. вложения к статье).




Это минимизированная версия скрипта, она быстрее загружается браузером.
Если Вы разбираетесь в JQuery, и хотите изучить или подправить исходники, смотрите спойлер.


Далее, открываем страницу: Управление дизайном » Редактирование шаблонов » Форум » Общий вид страниц форума.
Сразу после тега <body> вставляем следующее:

Код
<script type= "text/javascript" src= "/js/msg_premod.min.js"></script>


Шаг 4 - Изменение вида материала

Осталось сделать основную работу: прописать условные операторы, создать кнопку активации и т.д.
Приступим. Согласно вышеприведённой схеме изменим шаблон вида материала.
Управление дизайном » Редактирование шаблонов » Форум » Вид материалов.

Обычно, структура текста сообщения примерно такая:
  • текст сообщения ($MESSAGE$);
  • подпись ($SIGNATURE$);
  • вложения ($ATTACHMENT$);
  • поле редактирования ($EDITEDBY$).


Нам необходимо привести это всё к такому виду:

Код
<!-- Если пост написал "Пользователь" -->
<?if($GROUP_ID$==1)?>
  <!-- Если установлен $EDITEDBY$ или сообщение смотрит модератор -->
  <?if($EDITEDBY$ || $CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <!-- показываем сообщение, подпись и т.д. -->
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <!-- а для модераторов выводим также кнопку активации / деактивации. -->
  <?if($EDITEDBY$)?>
  <!-- Если $EDITEDBY$ установлен выводим кнопку для ДЕактивации -->
  <?else?>
  <!-- Иначе выводим кнопку для активации -->
  <?endif?>
  <?endif?>
  <?else?>
  <!-- Иначе сообщение показывать нельзя - вместо него показываем заглушку -->
  <?endif?>
<?else?>
  <!-- Иначе, если пост написал НЕ пользователь -->
  <!-- показываем сообщение, подпись и т.д. -->
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <!-- А $EDITEDBY$ показываем только модераторам -->
  <?endif?>
<?endif?>


Итоговый код получается таким:

Код
<?if($GROUP_ID$==1)?>
  <?if($EDITEDBY$ || $CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  $MESSAGE$
  <!-- Стандартный блок с подписью пользователя, например такой: -->
  <?if($SIGNATURE$)?><hr class="signatureHr"><span class="signatureView">$SIGNATURE$</span><?endif?>
  <!-- Стандартный блок вложений, например такой: -->
  <?if($ATTACHMENT$)?><div align="left" class="eAttach">Прикрепления: $ATTACHMENT$</div><?endif?>
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <div id="activate_progress_$ID$" class="msg_premod">
  <?if($EDITEDBY$)?>
  <div class="act_by">Сообщение активировал $EDITEDBY$.</div>
  <input type="button" value="Деактивировать" onclick="$(this).msg_premod($FID$,$TID$,$ID$,0);"/>
  <?else?>
  <div class="noact_msg_adm">Не активировано.</div>
  <input type="button" value="Активировать" onclick="$(this).msg_premod($FID$,$TID$,$ID$,1);"/>
  <?endif?>
  </div>
  <?endif?>
  <?else?>
  <div class="noact_msg">Сообщение на стадии премодерации...</div>
  <?endif?>
<?else?>
  $MESSAGE$
  <!-- Стандартный блок с подписью пользователя, например такой: -->
  <?if($SIGNATURE$)?><hr class="signatureHr"><span class="signatureView">$SIGNATURE$</span><?endif?>
  <!-- Стандартный блок вложений, например такой: -->
  <?if($ATTACHMENT$)?><div align="left" class="eAttach">Прикрепления: $ATTACHMENT$</div><?endif?>
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <!-- Стандартный EDITEDBY, например такой: -->
  <?if($EDITEDBY$)?><div class="edited">Сообщение отредактировал $EDITEDBY$</div><?endif?>
  <?endif?>
<?endif?>


Для красивого отображения контента, необходимо добавить несколько CSS-классов.
Для этого откройте страницу Управление дизайном » Редактирование шаблонов » Общие шаблоны » Таблица стилей (CSS), и добавьте в конец текста следующее:

Код
/* Forum premoderation start */
.noact_msg { /* Заглушка */
  color: #808080;
  font-family: monospace;
}
.msg_premod { /* Основной блок */
  padding: 5px 5px 15px 5px;
  background-color: #f1f1f1;
  text-align: center;
}
.msg_premod .act_by { /* Кем активировано */
  color: #808080;
  font-size: 7pt;
  padding: 15px 0px;
  text-align: right;
}
.msg_premod .noact_msg_adm { /* Не активировано! */
  color: #ff0000;
  padding: 15px 0px;
  font-weight: bold;
}
.act_msg_progress { /* во время активации */
  background: url('/.s/img/wd/3/ajaxs.gif') center no-repeat;
  padding: 8px;
}
/* Forum premoderation end */


Если всё сделано правильно, создание премодерации завершено! =)

Скриншоты

Вид сообщения для "немодераторов"


Активация сообщения модератором


Вид сообщения для модераторов после активации






В данном мануале рассматривалось премодерирование пользователей из конкретной группы.
Но при необходимости, с помощью условных кодов можно сделать премодерирование только на некоторые темы, только на некоторых разделах форума, только пользователям с рангом ниже, чем x и так далее.
Также ситуация обстоит и с правами модератора. Можно дать право модерирования только одному человеку, например.




[1] Если модераторов не много, и их состав меняется не часто, то можно разрешить пользователям редактировать свои сообщения, и выводить поле EDITEDBY всем остальным. Для этого потребуется перечислить в условных кодах никнеймы всех модераторов.

Прикреплённый файл: 470_msg_premod.min.js (0.9Kb)

Рейтинг: 23  (помогла ли Вам эта инструкция: да / нет)          Просмотров: 9118          Комментариев: 23
26.03.2015 в 21:08      0  

У меня после активации сообщения вылазит стандартная надпись "Сообщение отредактировал.. итд", хотя скрипт предусматривает "Сообщение активировал.. итд". Это мелочь, конечно, но выглядит нехорошо. Можно подумать, что админ что-то изменил в сообщении. Даже, я бы сказал, совершенно логично именно так и подумать.
27.03.2015 в 08:33      0  

Вы допустили ошибку просто, по идее надпись "кто отредактировал" не должно появляться.
Пересмотрите код ещё раз, где-то допустили ошибку.
27.03.2015 в 19:06      0  

Нюансы были согласованы с Вансан. Я не настолько сведущ, чтобы разбираться в тонкостях, и итоговый код был впрямую получен от него. Поэтому просто "пересмотреть код" особого толку не приносит. А разные эксперименты порой приводят к поломке дизайна. Вот, взгляните сами, если не затруднит. Понимаю, конечно, что засоряю тему многиме букваме, тогда удалите впоследствии.

Вот часть кода со страницы "вид материалов" (целиком не влазит, действует ограничение по символам):

 
 
Код
<?if($GROUP_NAME$)?><div class="postUserGroup">$GROUP_NAME$</div><?endif?>
  <?if($USER_STATUS$)?><div class="statusBlock">$USER_STATUS$</div><?endif?>
  <?if($GROUP_ID$)?> <?else?><br><br><br><br><br><?endif?></td>
  <td class="posttdMessage" valign="top">
  <?if($GROUP_ID$==1)?>
  <?if($EDITEDBY$ || $CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  $MESSAGE$
  <?if($ATTACHMENT$)?> <div align="left" class="eAttach">Прикрепления: $ATTACHMENT$</div><?endif?>
  <?if($SIGNATURE$)?><br><hr size="1" width="150" align="left" class="signatureHr"><span class="signatureView">$SIGNATURE$</span><?endif?>
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <div id="activate_progress_$ID$" class="msg_premod">
  <?if($EDITEDBY$)?>
  <div class="act_by">Сообщение активировал $EDITEDBY$.</div>
  <input type="button" value="Деактивировать" onclick="$(this).msg_premod($FID$,$TID$,$ID$,0);"/>
  <?else?>
  <div class="noact_msg_adm">Не активировано.</div>
  <input type="button" value="Активировать" onclick="$(this).msg_premod($FID$,$TID$,$ID$,1);"/>
  <?endif?>
  </div>
  <?endif?>
  <?else?>
  <div class="noact_msg">Сообщение на стадии премодерации...</div>
  <?endif?>
  <?else?>
  $MESSAGE$
  <?if($ATTACHMENT$)?><div align="left" class="eAttach">Прикрепления: $ATTACHMENT$</div><?endif?>
  <?if($SIGNATURE$)?><br><hr size="1" width="150" align="left" class="signatureHr"><span class="signatureView">$SIGNATURE$</span><?endif?>
  <?if($CUR_GROUP_ID$==4 || $CUR_GROUP_ID$==3)?>
  <?if($EDITEDBY$)?><br><br><div class="edited">Сообщение отредактировал $EDITEDBY$</div><?endif?>
  <?endif?>
  <?endif?>


В CSS:

Код
/* Forum premoderation start */
.noact_msg { /* Заглушка */
  color: #808080;
  font-family: monospace;
}
.msg_premod { /* Основной блок */
  padding: 5px 5px 15px 5px;
  background-color: #f1f1f1;
  text-align: center;
}
.msg_premod .act_by { /* Кем активировано */
  color: #808080;
  font-size: 7pt;
  padding: 15px 0px;
  text-align: right;
}
.msg_premod .noact_msg_adm { /* Не активировано! */
  color: #ff0000;
  padding: 15px 0px;
  font-weight: bold;
}
.act_msg_progress { /* во время активации */
  background: url('/.s/img/wd/3/ajaxs.gif') center no-repeat;
  padding: 8px;
}
/* Forum premoderation end */
27.03.2015 в 19:22      0  

Ссылку на сайт и тему, где можно посмотреть "некорректную работу", пожалуйста.
27.03.2015 в 22:21      0  

Специально создал тестовый аккаунт и сообщение. Работает корректно, как в описании. Провалиться мне на месте, но в прошлые разы надпись "отредактировал.." появлялась всегда, и избавиться от неё удавалось так - ДЕЙСТВИТЕЛЬНО отредактировать сообщение, изменив пару символов, сохранить, а потом сразу вернуть всё к предыдущему виду. Может быть, это связано с задержкой обновления данных на сервере или типа того. Как бы то ни было, вопрос снимается. Благодарю за внимание.
15.05.2015 в 06:26      0  

Ага, вот в чём дело.

http://www.floomby.ru/s2/5UNpFs

Надпись "Отредактировал..." видна, если я залогинен как админ. Остальным ничего не видно. Тогда это не проблема, конечно.
10.02.2014 в 21:24      0  

Следует отметить, что предложенный алгоритм применяется для сокрытия только сообщений, новую тему с его помощью скрыть не получится.
Максимум что удастся - это скрывать тело сообщения в новой теме (при этом тема всё равно будет видна в списках).
В этом случае вариант - не давать конкретной группе прав на создание новых тем вообще...
04.05.2013 в 18:31      0  

На всякий случай напомню: не забывайте переименовывать файл из 470_msg_premod.min.js в msg_premod.min.js
При написании статьи я не мог учесть, какое название получит файл после загрузки.
05.05.2013 в 10:04      0  

О необходимости переименования файла - это интуитивно ясно. Непонятки вызвал только шаг 4, а именно прописывание нового кода бесконфликтно с существующим.
Вансан, огромное спасибо за помощь и поддержку, а главное конечно - за сам мануал.
28.04.2013 в 10:53      0  

Функция нужная, спс.

Цитата
Итоговый код получается таким.

<?if($GROUP_ID$==1)?>
И т.д.

Подскажите, нужно ли прописывать кода дополнительно к уже существующему в шаблоне общему варианту для <?if($GROUP_ID$)?> или же существующий код необходимо именно удалять и менять на предложенный вами вариант?
28.04.2013 в 15:26      0  

Здравствуйте. Честно говоря, я не совсем понял постановку вопроса.
Пришлите мне в ЛС тот код, который у вас на данный момент находится в шаблоне Форум » Вид материалов.
26.03.2015 в 17:20      0  

Здравствуйте!
Я тоже не совсем понял шаг 4
Куда вставлять ваш код или на что заменить?
Отправил вам в личку код,который у меня на данный момент находится
в шаблоне Форум » Вид материалов
Прошу помочь!!!
26.03.2015 в 17:43      0  

Так вы пробовали в вид материалов вставить указанный код?
26.03.2015 в 17:56      0  

вместо моего кода? или дополнительно?
26.03.2015 в 18:02      +1  

Так вы вчитайтесь в ваш код и то, что написано. Прочитайте описания системных кодов - что бы вникнуть в суть. И делайте. Всегда лучше самому понимать. Чем ежели я вам сейчас дам кодовый код.
26.03.2015 в 20:12      0  

Спасибо! smile Разобрался!
Терпение и труд всё перетрут!
Вспомнил, что 20 лет назад я на Паскале проги писал. smile
Залез в учебник по html 
Оказалось всё не так уж и сложно smile
27.03.2013 в 16:47      0  

Добрый день! Все сделала, сообщение премодерации выходит для 2 групп : Пользователи, Гости. Вот только не работают кнопки активации, ума не приложу почему(((
28.03.2013 в 22:32      0  

Здравствуйте!
У Вас не подгружается js-файл.
Вполне вероятно допущена ошибка на 3 шаге.
В коде у Вас написано всё верно:
Код
<script type= "text/javascript" src= "/js/msg_premod.min.js"></script>

Однако по данному адресу (http://pfr-izhevsk.ru/js/msg_premod.min.js) ничего найти не получается.
В файловом менеджере создайте в корне вашего сайта папку js, и в неё загрузите скрипт (http://manual.ucoz.net/board/0-0-0-470-20), либо поменяйте путь в приведённом выше коде. wink
29.03.2013 в 08:53      0  

огромное спасибо!!!!!! поправила все лишь имя файла, и все удалось!  respect
23.01.2013 в 00:56      0  

Кстати, впервые это было реализовано на helper.ucoz.ru smile
23.01.2013 в 11:23      0  

Drinko, да, в ответ на мой вопрос по этой теме. smile
Тогда я был ещё неопытен, так что реализация данной функции заняла некоторое время. Зато результат оправдал все ожидания. smile
19.01.2013 в 23:30      0  

Все картинки сдвинуты на 1. Надеюсь скоро исправят...
Исправили! smile
03.03.2013 в 15:44      +1  

Огромное спасибо автору   smile