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

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

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

Первым делом создаём в Базе данных таблицу cms_user_black
Кому как удобнее.
Как вариант — в phpMyAdmin открыть свою Базу и во вкладке 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 — в любом удобном месте размещаем кнопку,
которая будет помещать юзера в Чёрный список, а в случае, если он уже в списке — будет предлагать,
наоборот, убрать из Чёрного списка:

  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
  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
  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');
вставляем:

  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'){

нужно код:
  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

  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

  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. // далее идут массовые рассылки, доступные только админам
+7
Fuze Fuze 11 лет назад #
Восстановил пост от имени автора.

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

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

может кому пригодится
+2
Нил™ Нил™ 11 лет назад #
Что то я попытался сейчас поставить на 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. $inCore->addSessionMessage($_LANG['SEND_MESS_OK'], 'info');
  8. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
  9. }
Они отличаются от того что в 1.10.1
Кто нибудь ставил?
0
Telema93 Telema93 11 лет назад #
Я ставил и даже доработку написал для сокрытия профиля, все работает
0
soccer soccer 11 лет назад #
Я кстати тоже столкнулся с данной проблемой в 1.10.1. В моем исходном коде нет строчки:
Код PHP:
  1. $inCore->redirect('/users/'.$inUser->id.'/messages-sent.html');
Сделал без неё, все отображается правильно, вот только не работает все равно. При нажатии на кнопку Добавить в ч.с. ничего не происходит (не пишет запросы в базу).
0
Aleks Shultz Aleks Shultz 11 лет назад #
Это строчка из 1.9, если не ошибаюсь. В 1.10> редирект не используется, так как сообщения в всплывающем окне. Кстати, тоже устанавливал этот хак, в базу заносит запись того кто нажимает на "жалоба" а ID того на кого жалоба, не определяет, поле пустое-"0" видимо
Код PHP:
  1. target_id=".$id
не срабатывает.

Может, если не сложно, выложите код, который работает на 1.10>
+1
Сергей Петрович Сергей Петрович 11 лет назад #
ДЛЯ 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. if($inCore->request('out_black', 'str')){
  8. $inDB->query("DELETE FROM cms_user_black WHERE user_id=".$inUser->id." AND target_id=".$id);
  9. }
  10. //-------------------------------------------------------------
ДАЛЕЕ
код, запрещающий отправку сообщений пользователям, находящимся в Чёрном списке:

Код PHP:
  1. // Обычная отправка (1 получатель)
  2. //
  3. if (!cmsCore::inRequest('massmail') && !$send_to_group){
  4. if($inDB->get_field('cms_user_black', "(user_id=$id AND target_id=".$inUser->id.")", 'id')>0){
  5. cmsCore::jsonOutput(array('error' => true, 'text' => "Вы не можете отправлять сообщения этому пользователю"));
  6. }else{
  7. //отправляем сообщение
  8. $msg_id = cmsUser::sendMessage($inUser->id, $id, $message);
  9. // отправляем уведомление на email если нужно
  10. $model->sendNotificationByEmail($id, $inUser->id, $msg_id);
  11. // Очищаем токен
  12. cmsUser::clearCsrfToken();
  13. cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['SEND_MESS_OK']." - ".$id));
  14. }
  15. }
  16. //
  17. // далее идут массовые рассылки, доступные только админам
0
Модератор Реальности Модератор Реальности 10 лет назад #
куда именно встаивить код второй?
+1
livecom livecom 11 лет назад #
Всем привет.
А кто может подсказать код, чтобы пользователю, занесенному в черный список нельзя было писать на стену тому, кто его занес? И в какой именно файл это изменение внести?
0
Александр Александр 7 лет назад #
Для 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. if (!$contact_id || !$message) { cmsCore::halt(); }
  9. // Отправка одному пользователю
  10. if (!cmsCore::inRequest('massmail'))
  11. {
  12. cmsCore::loadModel('users');
  13. $model_user = new cms_model_users;
  14. $inUser->onlineStats();
  15. if (!nmCore::isContactExists($contact_id, $inUser->id))
  16. {
  17. nmCore::addContact($contact_id, $inUser->id);
  18. }
  19. nmCore::updateContactsDateLastMsg($inUser->id, $contact_id, true);
  20. // Отправляем сообщение
  21. $message_id = cmsUser::sendMessage($inUser->id, $contact_id, $message);
  22. // Отправляем уведомление на email если нужно
  23. $model_user->sendNotificationByEmail($contact_id, $inUser->id, $message_id);
  24. $messages = nmCore::getMessages($inUser->id, $contact_id, $last_id);
  25. $messages = array_reverse($messages);
  26. cmsCore::jsonOutput(array('messages' => $messages));
  27. }
  28. if (!$inUser->is_admin) { cmsCore::halt(); }
  29. // отправить всем: получаем список всех пользователей
как сюда добавить вот это:

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

Еще от автора

Тема для никого - 1.10.7 и PHP 5.2.12 (часть 1)
Сложность программы растёт до тех пор, пока не превысит способности программиста (Законы Мерфи для программистов) Недавно ставил себе на локалку 1.10.
Тема для никого - 1.10.7 и PHP 5.2.12 (часть 2)
Программисты действуют рационально, лишь тогда, когда другие способы исчерпаны (Законы Мерфи для программистов) Часть 1 Порадовавшись успешной установ
Тема для никого - 1.10.7 и PHP 5.2.12 (часть 3)
Если программа полезна, ее обязательно переделывают (Законы Мерфи для программистов) Часть 2 Запустив сайт я проверил все доступные после установки ра
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.