Черный список

2567
Версия CMS - любая.
Заказчик попросил дать пользователям возможность заносить других юзеров в свой Чёрный список.

Если кому пригодится - пожалуйста!

Первым делом создаём в Базе данных таблицу cms_user_black
Кому как удобнее.
Как вариант - в phpMyAdmin открыть свою Базу и во вкладке SQL:

Код SQL:
  1. CREATE TABLE IF NOT EXISTS `cms_user_black` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `user_id` INT(11) NOT NULL,
  4. `target_id` INT(11) NOT NULL,
  5. `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  6. PRIMARY KEY (`id`),
  7. KEY `usr` (`user_id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
ТУТ МОМЕНТ!!! - CHARSET=cp1251 для версии CMS 1.9 Для CMS 1.10 исправить на CHARSET=utf8

Далее, в профиле пользователей - com_users_profile.tpl - в любом удобном месте размещаем кнопку,
которая будет помещать юзера в Чёрный список, а в случае, если он уже в списке - будет предлагать,
наоборот, убрать из Чёрного списка:

Код HTML:
  1. {if !$myprofile}
  2. {if $usr.in_black}
  3. <form name="black" action="" method="POST">
  4. <input name="out_black" type="submit" value="Убрать из списка">
  5. </form>
  6. {else}
  7. <form name="black" action="" method="POST">
  8. <input name="in_black" type="submit" value="В чёрный список">
  9. </form>
  10. {/if}
  11. {/if}
Обработчик кнопки помещаем в /components/users/frontend.php
в раздел

/////////////////////////////// VIEW PROFILE /////////////////////////////////////////////////
if ($do=='profile'){

Для этого, ПЕРЕД строкой
$usr = $model->getUser($id);
добавляем:
ДЛЯ 1.9
Код PHP:
  1.  
  2. //---------------- Обработка кнопки Чёрный Список -------------------
  3. if($inCore->request('in_black', 'str')){
  4. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  5. $inDB->query("INSERT INTO cms_user_black (user_id, target_id, data) VALUES ('".$inUser->id."', '".$id."', NOW())");
  6. }
  7.  
  8. if($inCore->request('out_black', 'str')){
  9. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  10. }
  11. //-------------------------------------------------------------
ДЛЯ 1.10
Код PHP:
  1.  
  2. //---------------- Обработка кнопки Чёрный Список -------------------
  3. $id = $inDB->get_field('cms_users', "login='{$login}'", 'id');
  4. if($inCore->request('in_black', 'str')){
  5. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  6. $inDB->query("INSERT INTO cms_user_black (user_id, target_id, data) VALUES ('".$inUser->id."', '".$id."', NOW())");
  7. }
  8.  
  9. if($inCore->request('out_black', 'str')){
  10. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  11. }
  12. //-------------------------------------------------------------
Также, в этом же файле, в этом же разделе, добавляем проверку, находится ли юзер в Чёрном списке или нет.
Для этого, ПЕРЕД строкой
$smarty = $inCore->initSmarty('components', 'com_users_profile.tpl');
вставляем:

Код PHP:
  1. $usr['in_black'] = $inDB->get_field('cms_user_black', "user_id=".$inUser->id." AND target_id=$id", 'id');
Собственно всё!!
Любой пользователь может помещать других юзеров в свой Чёрный список! Ну и удалять их оттуда, соответственно.
Какие будут накладываться ограничения, на юзеров, оказавшихся в списке, можете придумываться сами, сколько угодно.
Для примера:
на сайте заказчика, юзеры НЕ МОГУТ отправлять сообщения, пользователям, у которых они находятся в Чёрных списках.
Чтобы это сделать, всё в том же файле /components/users/frontend.php
в разделе

/////////////////////////////// SEND MESSAGE /////////////////////////////////////////////////////////////
if ($do=='sendmessage'){

нужно код:
Код PHP:
  1.  
  2. //
  3. // Обычная отправка (1 получатель)
  4. //
  5. if (!$inCore->inRequest('massmail') && !$send_to_group){
  6. //отправляем сообщение
  7. $msg_id = cmsUser::sendMessage($from_id, $to_id, $message);
  8. // отправляем уведомление на email если нужно
  9. $model->sendNotificationByEmail($to_id, $from_id, $msg_id);
  10.  
  11. $inCore->addSessionMessage($_LANG['SEND_MESS_OK'], 'info');
  12.  
  13. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
  14. }
  15.  
ЗАМЕНИТЬ на:
ДЛЯ 1.9

Код PHP:
  1. //
  2. // Обычная отправка (1 получатель)
  3. //
  4. if (!$inCore->inRequest('massmail') && !$send_to_group){
  5.  
  6. if($inDB->get_field('cms_user_black', "(user_id=$to_id AND target_id=$from_id)", 'id')>0){
  7. $inCore->addSessionMessage("Вы не можете отправлять сообщения этому пользователю", 'info');
  8. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
  9. }else{
  10. //отправляем сообщение
  11. $msg_id = cmsUser::sendMessage($from_id, $to_id, $message);
  12. // отправляем уведомление на email если нужно
  13. $model->sendNotificationByEmail($to_id, $from_id, $msg_id);
  14. $inCore->addSessionMessage($_LANG['SEND_MESS_OK'], 'info');
  15. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
  16. }
  17. }
ДЛЯ 1.10

Код PHP:
  1. // Обычная отправка (1 получатель)
  2. //
  3. if (!cmsCore::inRequest('massmail') && !$send_to_group){
  4.  
  5. if($inDB->get_field('cms_user_black', "(user_id=$id AND target_id=".$inUser->id.")", 'id')>0){
  6. cmsCore::jsonOutput(array('error' => true, 'text' => "Вы не можете отправлять сообщения этому пользователю"));
  7. }else{
  8. //отправляем сообщение
  9. $msg_id = cmsUser::sendMessage($inUser->id, $id, $message);
  10. // отправляем уведомление на email если нужно
  11. $model->sendNotificationByEmail($id, $inUser->id, $msg_id);
  12.  
  13. // Очищаем токен
  14. cmsUser::clearCsrfToken();
  15.  
  16. cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['SEND_MESS_OK']." - ".$id));
  17. }
  18. }
  19.  
  20. //
  21. // далее идут массовые рассылки, доступные только админам
цветное облако | Создание статей с отложенной публикацией
Комментарии (19)
Fuze 9 марта 2013 в 12:50 +7
Восстановил пост от имени автора.

офтоп
lokanaft 9 марта 2013 в 13:01 +1
А плагином можно?
Димитриус 9 марта 2013 в 13:48 +1
да можно.
omarovArt 9 марта 2013 в 21:15 +2
А "можно" будет?))
maia 10 марта 2013 в 04:33 0
А это в любой версии работает?
Ленивый 10 марта 2013 в 04:47 +2
в любой.
только при создании таблицы в БД обратите внимание на кодировку
Нил™ 11 марта 2013 в 21:51 +3
Дополнение правильное. Давно напрашивалось на то, что бы быть в стандартной комплектации системы. Спасибо автору.
Telema93 22 марта 2013 в 02:55 +2
Сделал для закрытия профиля, если в бан добавлен
Код PHP:
  1.  
  2. // если в черном списке
  3. $usrbl=$usr['id'];
  4. if($inDB->get_field('cms_user_black', "(user_id=$usrbl)", 'id')>0){
  5. $smarty = $inCore->initSmarty('components', 'com_users_not_allow.tpl');
  6. $smarty->assign('is_auth', $inUser->id);
  7. $smarty->assign('usr', $usr);
  8. $smarty->display('com_users_not_allow.tpl');
  9. $inCore->addSessionMessage("Вы в черном списке", 'info');
  10. return;
  11.  
Для того чтоб не банили админа в шаблоне профиля правим правило на это - {if !$myprofile && $usr.grp != "Администраторы"} (можно добавить модераторов и прочие группы)
и надо исключить возможность в друзья предложение добавлять, хотя уже проще в плагин запихнуть будет скрипт
Шадринец 26 сентября 2013 в 05:36 0
Подскажи где именно вставлять код "закрытия профиля"
Александр 6 февраля 2018 в 18:11 0
вот если так на 1.10.7 вставить:

Код PHP:
  1.  
  2. // если в черном списке
  3. $usrbl=$usr['id'];
  4. if($inDB->get_field('cms_user_black', "(user_id=$usrbl)", 'id')>0){
  5. cmsPage::initTemplate('components', 'com_users_not_allow.tpl');
  6. assign('is_auth', $inUser->id)->
  7. assign('usr', $usr)->
  8. display('com_users_not_allow.tpl');
  9. $inCore->addSessionMessage("Вы в черном списке", 'info');
  10. return;
  11. }
то профили обоюдно выдают ошибку 500 и со стороны того кто добавил и кого добавили, что не так интересно.
Александр 7 февраля 2018 в 09:57 0
Если подумать то надо вот так:
Код PHP:
  1.  
  2. // если в черном списке
  3. if($inDB->get_field('cms_user_black', "(user_id=$id AND target_id=".$inUser->id.")", 'id')>0){
  4. cmsPage::initTemplate('components', 'com_users_not_allow')->
  5. assign('is_auth', $inUser->id)->
  6. assign('usr', $usr)->
  7. display('com_users_not_allow.tpl');
  8. $inCore->addSessionMessage("Вы в черном списке", 'info');
  9. return;
  10. }
Вставлять во frontend.php перед - // просмотр профиля запрещен

может кому пригодится
Нил™ 29 марта 2013 в 17:25 +2
Что то я попытался сейчас поставить на 1.10.1 думаю одной сменой кодировки тут не обойдешься.
строки приведенные тут
Код PHP:
  1. /
  2. if (!$inCore->inRequest('massmail') && !$send_to_group){
  3. //отправляем сообщение
  4. $msg_id = cmsUser::sendMessage($from_id, $to_id, $message);
  5. // отправляем уведомление на email если нужно
  6. $model->sendNotificationByEmail($to_id, $from_id, $msg_id);
  7.  
  8. $inCore->addSessionMessage($_LANG['SEND_MESS_OK'], 'info');
  9.  
  10. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
  11. }
Они отличаются от того что в 1.10.1
Кто нибудь ставил?
Telema93 9 апреля 2013 в 14:32 0
Я ставил и даже доработку написал для сокрытия профиля, все работает
soccer 1 июня 2013 в 16:45 0
Я кстати тоже столкнулся с данной проблемой в 1.10.1. В моем исходном коде нет строчки:
Код PHP:
  1. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
Сделал без неё, все отображается правильно, вот только не работает все равно. При нажатии на кнопку Добавить в ч.с. ничего не происходит (не пишет запросы в базу).
Aleks Shultz 7 июня 2013 в 00:01 0
Это строчка из 1.9, если не ошибаюсь. В 1.10> редирект не используется, так как сообщения в всплывающем окне. Кстати, тоже устанавливал этот хак, в базу заносит запись того кто нажимает на "жалоба" а ID того на кого жалоба, не определяет, поле пустое-"0" видимо
Код PHP:
  1. target_id=".$id
не срабатывает.

Может, если не сложно, выложите код, который работает на 1.10>
Ленивый 29 июля 2013 в 07:48 +1
ДЛЯ 1.10
! ! ! ! !

в 1.10 в профиле отсутствует переменная $id
значит нужно её создать:

Код PHP:
  1. //---------------- Обработка кнопки Чёрный Список -------------------
  2. $id = $inDB->get_field('cms_users', "login='{$login}'", 'id');
  3. if($inCore->request('in_black', 'str')){
  4. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  5. $inDB->query("INSERT INTO cms_user_black (user_id, target_id, data) VALUES ('".$inUser->id."', '".$id."', NOW())");
  6. }
  7.  
  8. if($inCore->request('out_black', 'str')){
  9. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  10. }
  11. //-------------------------------------------------------------
ДАЛЕЕ
код, запрещающий отправку сообщений пользователям, находящимся в Чёрном списке:

Код PHP:
  1. // Обычная отправка (1 получатель)
  2. //
  3. if (!cmsCore::inRequest('massmail') && !$send_to_group){
  4.  
  5. if($inDB->get_field('cms_user_black', "(user_id=$id AND target_id=".$inUser->id.")", 'id')>0){
  6. cmsCore::jsonOutput(array('error' => true, 'text' => "Вы не можете отправлять сообщения этому пользователю"));
  7. }else{
  8.  
  9. //отправляем сообщение
  10. $msg_id = cmsUser::sendMessage($inUser->id, $id, $message);
  11. // отправляем уведомление на email если нужно
  12. $model->sendNotificationByEmail($id, $inUser->id, $msg_id);
  13.  
  14. // Очищаем токен
  15. cmsUser::clearCsrfToken();
  16.  
  17. cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['SEND_MESS_OK']." - ".$id));
  18. }
  19. }
  20.  
  21. //
  22. // далее идут массовые рассылки, доступные только админам
Модератор Реальности 29 октября 2014 в 18:06 0
куда именно встаивить код второй?
livecom 20 сентября 2013 в 17:23 +1
Всем привет.
А кто может подсказать код, чтобы пользователю, занесенному в черный список нельзя было писать на стену тому, кто его занес? И в какой именно файл это изменение внести?
Александр 8 сентября 2017 в 11:59 0
Для 1.10.7 проделал - всё работает, главное внимательно смержить, но есть одно но, как поётся в песне...

Нужно применить как в примере для личной переписки

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

/plugins/p_neomessenger/nmajax.php

место:

Код PHP:
  1. // Отправка сообщения
  2. if ($act == 'sendMessage')
  3. {
  4. $contact_id = cmsCore::request('contact_id', 'int', 0);
  5. $message = cmsCore::request('message', 'html', '');
  6. $message = cmsCore::parseSmiles($message, true);
  7. $last_id = cmsCore::request('last_id', 'int', 0);
  8.  
  9. if (!$contact_id || !$message) { cmsCore::halt(); }
  10.  
  11. // Отправка одному пользователю
  12. if (!cmsCore::inRequest('massmail'))
  13. {
  14. cmsCore::loadModel('users');
  15. $model_user = new cms_model_users;
  16.  
  17. $inUser->onlineStats();
  18.  
  19. if (!nmCore::isContactExists($contact_id, $inUser->id))
  20. {
  21. nmCore::addContact($contact_id, $inUser->id);
  22. }
  23.  
  24. nmCore::updateContactsDateLastMsg($inUser->id, $contact_id, true);
  25.  
  26. // Отправляем сообщение
  27. $message_id = cmsUser::sendMessage($inUser->id, $contact_id, $message);
  28.  
  29. // Отправляем уведомление на email если нужно
  30. $model_user->sendNotificationByEmail($contact_id, $inUser->id, $message_id);
  31.  
  32. $messages = nmCore::getMessages($inUser->id, $contact_id, $last_id);
  33. $messages = array_reverse($messages);
  34.  
  35. cmsCore::jsonOutput(array('messages' => $messages));
  36.  
  37. }
  38.  
  39. if (!$inUser->is_admin) { cmsCore::halt(); }
  40.  
  41. // отправить всем: получаем список всех пользователей
как сюда добавить вот это:

Код PHP:
  1. // Обычная отправка (1 получатель)
  2. //
  3. if (!cmsCore::inRequest('massmail') && !$send_to_group){
  4.  
  5. [b]if($inDB->get_field('cms_user_black', "(user_id=$id AND target_id=".$inUser->id.")", 'id')>0){
  6. cmsCore::jsonOutput(array('error' => true, 'text' => "Вы не можете отправлять сообщения этому пользователю"));
  7. }else{[/b]
  8. //отправляем сообщение
  9. $msg_id = cmsUser::sendMessage($inUser->id, $id, $message);
  10. // отправляем уведомление на email если нужно
  11. $model->sendNotificationByEmail($id, $inUser->id, $msg_id);
  12.  
  13. // Очищаем токен
  14. cmsUser::clearCsrfToken();
  15.  
  16. cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['SEND_MESS_OK']." - ".$id));
  17. }
  18. }
  19.  
  20. //
  21. // далее идут массовые рассылки, доступные только админам
может кто делал уже?