Оповещения внутри форума ответы на ваши темы/цитирование/упоминание

Автор sibrus, 14 сентября 2018, 18:23:49

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

sibrus

Можно ли как-то реализовать оповещения внутри форума, по типу уведомлений о ЛС? То есть если поступили новые ответы на созданные темы, или кто-то процитировал сообщение, упомянул ник. Есть какие-то готовые решения или код? Здесь через поиск что-то не получилось ничего найти.

S.T.A.L.K.E.R.


sibrus

Цитата: S.T.A.L.K.E.R. от 14 сентября 2018, 18:35:20Есть такое - https://dragomano.ru/translations/enotify
Спасибо! Но как-то это слишком круто. Нет ли чего-то попроще? С каким нибудь привычным красным значком оповещения

S.T.A.L.K.E.R.

Цитата: sibrus от 14 сентября 2018, 18:49:54Спасибо! Но как-то это слишком круто. Нет ли чего-то попроще? С каким нибудь привычным красным значком оповещения
Если на подобии как здесь оповещения вверху?
Делали как то с Алексеем у меня на форуме.Там только вручную все,код+правки.
Это только если он добро даст на это.

kak2z

Цитата: S.T.A.L.K.E.R. от 14 сентября 2018, 19:50:31Это только если он добро даст на это.
та ради бога)) делайте конечно)) не разберешься - стучи в скайп)) помогу))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

S.T.A.L.K.E.R.

Цитата: kak2z от 15 сентября 2018, 10:44:03та ради бога)) делайте конечно)) не разберешься - стучи в скайп)) помогу))
Если человек решится помогу. У меня все шаги задокументированы если что. Спасибо.

sibrus

Цитата: S.T.A.L.K.E.R. от 15 сентября 2018, 12:09:42Если человек решится помогу. У меня все шаги задокументированы если что. Спасибо.
Я уже давно решился)) Только вот не понял. Вы написали "Если на подобии как здесь оповещения вверху?" Здесь разве есть такие оповещения?

S.T.A.L.K.E.R.

Цитата: sibrus от 16 сентября 2018, 16:38:35Я уже давно решился)) Только вот не понял. Вы написали "Если на подобии как здесь оповещения вверху?" Здесь разве есть такие оповещения?
В самом верху оповещения так и называются.

По делу
Таблица
Код

CREATE TABLE IF NOT EXISTS `smf_nick_event` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `poster_id` mediumint(8) NOT NULL,
  `mention_id` mediumint(8) NOT NULL,
  `id_msg` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `poster_id` (`poster_id`,`mention_id`,`id_msg`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


файл /Source/NickEvent.php
Код
<?php
//NickEvent start
//NickEvent end

//Главная функция
function NickEventMain(){
global $smcFunc, $context, $user_info, $scripturl;

$context['start'] = isset($_GET['start']) ? (int)$_GET['start'] : 0;

if($user_info['is_guest']) fatal_lang_error('no_access', false);
if(!isset($_GET['sa'])) ListNickEvent();

}

//отображение уведомлений
function ListNickEvent(){
global $smcFunc, $context, $user_info, $scripturl;

//ToDo - вынести куда надо/оформить настройки как то по другому
$modSettings['newentPerPage'] = 27;
$context['newent_url'] = 'action=newent';

if(isset($_GET['clear'])){
$smcFunc['db_query']('', '
DELETE
FROM {db_prefix}nick_event
WHERE mention_id = {int:mention_id}
', array(
'mention_id' => $user_info['id'],
));
redirectexit($context['newent_url']);
}

$context['page_title'] = 'Упоминания в сообщениях';

$context['linktree'][1] = array(
'url' => $context['newent_url'],
'name' => 'Упоминания в сообщениях',);


//строка запроса
$sql_string = '
FROM {db_prefix}nick_event AS ne
LEFT JOIN {db_prefix}members AS mp ON (mp.id_member = ne.poster_id)
LEFT JOIN {db_prefix}messages AS msg ON (msg.id_msg = ne.id_msg)
WHERE ne.mention_id = {int:mention_id}';

//подсчитываем общее количество
$result_count = $smcFunc['db_query']('', '
SELECT COUNT(*) as count
' . $sql_string . '',
array(
'mention_id' => $user_info['id'],
));
list($context['select_max_value']) = $smcFunc['db_fetch_row']($result_count);

$smcFunc['db_free_result']($result_count);

//делаем выборку
$result = $smcFunc['db_query']('', '
SELECT ne.id AS id, ne.poster_id, ne.mention_id, ne.id_msg, mp.real_name AS poster_name, msg.id_topic, msg.subject, msg.body
' . $sql_string . '
ORDER BY ne.id DESC
LIMIT {int:start}, {int:select_max_value}',
array(
'mention_id' => $user_info['id'],
'start' => $context['start'],
'select_max_value' => $modSettings['newentPerPage'],
));

$context['events'] = array();
if($smcFunc['db_num_rows']($result) >0){
while($row = $smcFunc['db_fetch_assoc']($result)){
$context['events'][] = $row;
}
}
$smcFunc['db_free_result']($result);



$context['newent']['buttons'] = array();
$context['newent']['buttons']['clear'] = array(
'text' => 'delete',
'image' => 'add_poll.gif',
'lang' => true,
'url' => $scripturl . '?action=newent;clear',
'active' => true,
);


$context['page_index'] = constructPageIndex($context['newent_url'] . ';start=%1$d', $context['start'], $context['select_max_value'], $modSettings['newentPerPage'], true);

$context['newent']['catbg'] = 'Упоминания в сообщениях';

$context['sub_template'] = 'list_event';
loadTemplate('NickEvent');

}


//NickEvent start
/*
** $string - то что парсим
** $id_msg - ИД сообщения который парсим
*/
function NickEventParse($string = '', $id_msg = 0){
global $smcFunc, $context, $user_info;

//Если нет ИД сообщения или пользователь гость то возвращаемся
if($id_msg == 0 || $user_info['id'] == 0) return;

//Выбираем все ники из тега цитаты
$quotenicknames = array();
$pattern = '/\[quote author=(.*?) link/';
preg_match_all($pattern, $string, $matches);
$quotenicknames = array_unique($matches[1]);


//Выбираем все ники из тега nick
$matches = array();
$pattern = '/\[nick\](.*?)\[\/nick\]/';
preg_match_all($pattern, $string, $matches);
$nicknames = array_unique($matches[1]);

$nicknames = array_merge($quotenicknames, $nicknames);
$nicknames = array_unique($nicknames);

//Если ников нет то возвращаемся
if(count($nicknames) == 0) return;

//Перебираем все ники
foreach($nicknames AS $nickname){

//1. Найти данные пользователя
$result_member = $smcFunc['db_query']('', '
SELECT id_member AS id
FROM  {db_prefix}members
WHERE member_name LIKE {string:nickname}
OR real_name LIKE {string:nickname}
LIMIT 1', array(
'nickname' => $nickname,
)
);

//Если нет ника то не продолжаем тело цикла
if($smcFunc['db_num_rows']($result_member) != 1) continue;
$member = $smcFunc['db_fetch_assoc']($result_member);

//Если ИД пользователя и ИД того кого упомянули одинаковый то тело цикла не продолжаем
if($member['id'] == $user_info['id']) continue;

//2. Добавить в таблицу smf_nick_event данные  / ид того кто постит / ид того кого упомянули / ид сообщения
$smcFunc['db_insert']('ignore',
'{db_prefix}nick_event',
array('poster_id' => 'int', 'mention_id' => 'int', 'id_msg' => 'int'),
array($user_info['id'], $member['id'], $id_msg),
array('id')
);

}

}

//вторая версия функции
function NickEventParse2($string = '', $id_msg = 0){
global $smcFunc, $context, $user_info;

//Если нет ИД сообщения или пользователь гость то возвращаемся
if($id_msg == 0 || $user_info['id'] == 0) return;

//Выбираем все ники
$matches = array();
$pattern = '/\[nick\](.*?)\[\/nick\]/';
preg_match_all($pattern, $string, $matches);

//Если ников нет то возвращаемся
if(count($matches[1]) == 0) return;

//Перебираем все ники
$already = array();
$nicknames = array();
$nicknames = array_unique($matches[1]);


//Найти данные пользователей
$result_members = $smcFunc['db_query']('', '
SELECT id_member AS id
FROM  {db_prefix}members
WHERE member_name IN ({array_string:nicknames})
OR real_name IN ({array_string:nicknames})',
array(
'nicknames' => array_values($nicknames),
)
);


//Если нет имен то выходим из функции
if($smcFunc['db_num_rows']($result_members) == 0) return;

//собираем все ИД пользователей
$ids_members = array();
while($member = $smcFunc['db_fetch_assoc']($result_members)){
$ids_members[] = $member['id'];
}
$ids_members = array_unique($ids_members);


//Добавить в таблицу smf_nick_quote данные  / ид того кто постит / ид того кого упомянули / ид сообщения
foreach($ids_members AS $id){
if($user_info['id'] != $id){
$smcFunc['db_insert']('ignore',
'{db_prefix}nick_event',
array('poster_id' => 'int', 'mention_id' => 'int', 'id_msg' => 'int'),
array($user_info['id'], $id, $id_msg),
array('id')
);
}
}

}


function get_newents(){
global $smcFunc, $context, $user_info, $scripturl, $modSettings;

if($user_info['is_guest'])return;

$newents = 0;

$cache_id = 'newents'. $user_info['id'];

if (!empty($modSettings['cache_enable'])) $newents = cache_get_data($cache_id);

if (!isset($newents) || !is_int($newents)) {

//строка запроса
$sql_string = '
FROM {db_prefix}nick_event AS ne
LEFT JOIN {db_prefix}members AS mp ON (mp.id_member = ne.poster_id)
LEFT JOIN {db_prefix}messages AS msg ON (msg.id_msg = ne.id_msg)
WHERE ne.mention_id = {int:mention_id}';

//подсчитываем общее количество
$result_count = $smcFunc['db_query']('', '
SELECT COUNT(*) as count
' . $sql_string . '',
array(
'mention_id' => $user_info['id'],
));
list($newents) = $smcFunc['db_fetch_row']($result_count);

if (!empty($modSettings['cache_enable'])) cache_put_data($cache_id, (int)$newents, 30);

}

return $newents;
}

//NickEvent end



файл NickEvent.template.php
Код
<?php
//NickEvent start
//NickEvent end

function template_list_event(){
global $context, $user_info, $scripturl;
template_up_page();
echo '
<ul>';

foreach($context['events'] AS $value){
echo '
<li>
<b>' . $value['poster_name'] . '</b> упомянул Вас в своем сообщении <a href="' . $scripturl . '?topic=' . $value['id_topic'] .'.msg' . $value['id_msg'] .'#msg' . $value['id_msg'] .'"><b>' . $value['subject'] .'</b></a>
</li>';
}
echo '
</ul>';
template_down_page();
}


//верхняя часть контента
function template_up_page(){
global $txt, $context, $settings;

echo '
<div class="pagesection">
' .template_button_strip($context['newent']['buttons'], 'right').  '
<div class="pagelinks floatleft">' . $txt['pages'] . ': ' . $context['page_index'] . '</div>
</div>
<div class="windowbg">
<span class="topslice"><span></span></span>
<div class="content">';
}

//нижняя часть контента
function template_down_page(){
global $txt, $context;
echo '
</div>
<span class="botslice"><span></span></span>
</div>
<div class="pagesection">
<div class="pagelinks">' . $txt['pages'] . ': ' . $context['page_index'] . '</div>
</div>
<br />';
}


файл Subs.php
добавить в бб теги
Код
			//NickQuote start
array(
'tag' => 'nick',
'before' => '',
'after' => '',
),
//NickQuote end

так же в конец добавить
Код
//NickEvent start
require_once('NickEvent.php');
//NickEvent end

файл Subs-Post.php
в конец добавить
Код
//NickEvent start
require_once('NickEvent.php');
//NickEvent end

это
Код
	// Increase the number of posts and topics on the board.
if ($msgOptions['approved'])
$smcFunc['db_query']('', '
UPDATE {db_prefix}boards
SET num_posts = num_posts + 1' . ($new_topic ? ', num_topics = num_topics + 1' : '') . '
WHERE id_board = {int:id_board}',
array(
'id_board' => $topicOptions['board'],
)
);

заменить на это
Код
	// Increase the number of posts and topics on the board.
if ($msgOptions['approved']){
$smcFunc['db_query']('', '
UPDATE {db_prefix}boards
SET num_posts = num_posts + 1' . ($new_topic ? ', num_topics = num_topics + 1' : '') . '
WHERE id_board = {int:id_board}',
array(
'id_board' => $topicOptions['board'],
)
);
//NickEvent start
NickEventParse($msgOptions['body'], $msgOptions['id']);
//NickEvent end
}





Если стоит мод Nick To Reply привести в файле Display.php код к такому виду
Код
	// Nickname To Reply
if (!empty($options['display_quick_reply']) && !$context['user']['is_guest'] && empty($context['arantor_menu']))
$output['member']['link'] = '<span style="cursor: pointer;' . (!empty($output['member']['user_color']) ? ' color: #' . $output['member']['user_color'] : '') . '" onclick="nicknameToReply(\'[b]' . (!empty($output['member']['user_color']) ? '[color=#' . $output['member']['user_color'] . ']' : (!empty($output['member']['group_color']) ? '[color=' . $output['member']['group_color'] . ']' : '')) . '[nick]' . $output['member']['name'] . '[/nick]' . (!empty($output['member']['user_color']) || !empty($output['member']['group_color']) ? '[/color]' : '') . '[/b], \');" title="' . $txt['nickname_hint'] . '">' . (!empty($modSettings['MemberColorLink']) && !empty($output['member']['colored_name']) ? $output['member']['colored_name'] : $output['member']['name']) . '</span>';



в файле /index.php
найти это
Код
		'xmlhttp' => array('Xml.php', 'XMLhttpMain'),

добавить ПОСЛЕ это
Код
		//NickEvent start
'newent' => array('NickEvent.php', 'NickEventMain'),
//NickEvent end

после всего этого если кто то процитирует ваше сообщение или упомянет в теге nick то по этому адресу будет видно кто когда и где упомянул /index.php?action=newent

sibrus

Цитата: S.T.A.L.K.E.R. от 16 сентября 2018, 16:57:21В самом верху оповещения так и называются.

Спасибо большое! Буду внедрять. Только вот насчет здешних оповещений так и не понял. На этом форуме я не вижу таких оповещений.

S.T.A.L.K.E.R.

Цитата: sibrus от 16 сентября 2018, 17:24:13На этом форуме я не вижу таких оповещений.
Вам недоступны вложения в этом разделе.

sibrus

Цитата: S.T.A.L.K.E.R. от 16 сентября 2018, 17:33:24Вам недоступны вложения в этом разделе.
У меня нет такого. Может их еще профиле надо подключать?

S.T.A.L.K.E.R.

Да вроде как нет.Не знаю даже.Это в принципе бета,и тут любые приколы могут быть.

Serifa

Цитата: sibrus от 16 сентября 2018, 18:28:54Может их еще профиле надо подключать?
Обязательно надо зайти в профиль - настройки профиля - уведомления и емаил.
И потыкать там все галочки.
И там еще надо думать, что именно тыкаешь.

Админу лучше самому все проверить, и уже потом по умолчанию настраивать для всех пользователей.
версия форума 2.1
«- Помощник капитана Бакстер, - заявил Лумис, - безбожно врет. Все отнюдь не под контролем, вернее, не под его контролем. Корабль захвачен представителями небелковой формы разумной жизни, которые маскируются под обслуживающих роботов, а некоторые даже не делают и этого...»
«То, что у тебя есть, лечится антибиотиками» (nowhere man, 1995)
В телеге

S.T.A.L.K.E.R.

Цитата: S.T.A.L.K.E.R. от 16 сентября 2018, 16:57:21файл /Source/NickEvent.php
Код
<?php
//NickEvent start
//NickEvent end

//Главная функция
function NickEventMain(){
global $smcFunc, $context, $user_info, $scripturl;

$context['start'] = isset($_GET['start']) ? (int)$_GET['start'] : 0;

if($user_info['is_guest']) fatal_lang_error('no_access', false);
if(!isset($_GET['sa'])) ListNickEvent();

}

//отображение уведомлений
function ListNickEvent(){
global $smcFunc, $context, $user_info, $scripturl;

//ToDo - вынести куда надо/оформить настройки как то по другому
$modSettings['newentPerPage'] = 27;
$context['newent_url'] = 'action=newent';

if(isset($_GET['clear'])){
$smcFunc['db_query']('', '
DELETE
FROM {db_prefix}nick_event
WHERE mention_id = {int:mention_id}
', array(
'mention_id' => $user_info['id'],
));
redirectexit($context['newent_url']);
}

$context['page_title'] = 'Упоминания в сообщениях';

$context['linktree'][1] = array(
'url' => $context['newent_url'],
'name' => 'Упоминания в сообщениях',);


//строка запроса
$sql_string = '
FROM {db_prefix}nick_event AS ne
LEFT JOIN {db_prefix}members AS mp ON (mp.id_member = ne.poster_id)
LEFT JOIN {db_prefix}messages AS msg ON (msg.id_msg = ne.id_msg)
WHERE ne.mention_id = {int:mention_id}';

//подсчитываем общее количество
$result_count = $smcFunc['db_query']('', '
SELECT COUNT(*) as count
' . $sql_string . '',
array(
'mention_id' => $user_info['id'],
));
list($context['select_max_value']) = $smcFunc['db_fetch_row']($result_count);

$smcFunc['db_free_result']($result_count);

//делаем выборку
$result = $smcFunc['db_query']('', '
SELECT ne.id AS id, ne.poster_id, ne.mention_id, ne.id_msg, mp.real_name AS poster_name, msg.id_topic, msg.subject, msg.body
' . $sql_string . '
ORDER BY ne.id DESC
LIMIT {int:start}, {int:select_max_value}',
array(
'mention_id' => $user_info['id'],
'start' => $context['start'],
'select_max_value' => $modSettings['newentPerPage'],
));

$context['events'] = array();
if($smcFunc['db_num_rows']($result) >0){
while($row = $smcFunc['db_fetch_assoc']($result)){
$context['events'][] = $row;
}
}
$smcFunc['db_free_result']($result);



$context['newent']['buttons'] = array();
$context['newent']['buttons']['clear'] = array(
'text' => 'delete',
'image' => 'add_poll.gif',
'lang' => true,
'url' => $scripturl . '?action=newent;clear',
'active' => true,
);


$context['page_index'] = constructPageIndex($context['newent_url'] . ';start=%1$d', $context['start'], $context['select_max_value'], $modSettings['newentPerPage'], true);

$context['newent']['catbg'] = 'Упоминания в сообщениях';

$context['sub_template'] = 'list_event';
loadTemplate('NickEvent');

}


//NickEvent start
/*
** $string - то что парсим
** $id_msg - ИД сообщения который парсим
*/
function NickEventParse($string = '', $id_msg = 0){
global $smcFunc, $context, $user_info;

//Если нет ИД сообщения или пользователь гость то возвращаемся
if($id_msg == 0 || $user_info['id'] == 0) return;

//Выбираем все ники из тега цитаты
$quotenicknames = array();
$pattern = '/\[quote author=(.*?) link/';
preg_match_all($pattern, $string, $matches);
$quotenicknames = array_unique($matches[1]);


//Выбираем все ники из тега nick
$matches = array();
$pattern = '/\[nick\](.*?)\[\/nick\]/';
preg_match_all($pattern, $string, $matches);
$nicknames = array_unique($matches[1]);

$nicknames = array_merge($quotenicknames, $nicknames);
$nicknames = array_unique($nicknames);

//Если ников нет то возвращаемся
if(count($nicknames) == 0) return;

//Перебираем все ники
foreach($nicknames AS $nickname){

//1. Найти данные пользователя
$result_member = $smcFunc['db_query']('', '
SELECT id_member AS id
FROM  {db_prefix}members
WHERE member_name LIKE {string:nickname}
OR real_name LIKE {string:nickname}
LIMIT 1', array(
'nickname' => $nickname,
)
);

//Если нет ника то не продолжаем тело цикла
if($smcFunc['db_num_rows']($result_member) != 1) continue;
$member = $smcFunc['db_fetch_assoc']($result_member);

//Если ИД пользователя и ИД того кого упомянули одинаковый то тело цикла не продолжаем
if($member['id'] == $user_info['id']) continue;

//2. Добавить в таблицу smf_nick_event данные  / ид того кто постит / ид того кого упомянули / ид сообщения
$smcFunc['db_insert']('ignore',
'{db_prefix}nick_event',
array('poster_id' => 'int', 'mention_id' => 'int', 'id_msg' => 'int'),
array($user_info['id'], $member['id'], $id_msg),
array('id')
);

}

}

//вторая версия функции
function NickEventParse2($string = '', $id_msg = 0){
global $smcFunc, $context, $user_info;

//Если нет ИД сообщения или пользователь гость то возвращаемся
if($id_msg == 0 || $user_info['id'] == 0) return;

//Выбираем все ники
$matches = array();
$pattern = '/\[nick\](.*?)\[\/nick\]/';
preg_match_all($pattern, $string, $matches);

//Если ников нет то возвращаемся
if(count($matches[1]) == 0) return;

//Перебираем все ники
$already = array();
$nicknames = array();
$nicknames = array_unique($matches[1]);


//Найти данные пользователей
$result_members = $smcFunc['db_query']('', '
SELECT id_member AS id
FROM  {db_prefix}members
WHERE member_name IN ({array_string:nicknames})
OR real_name IN ({array_string:nicknames})',
array(
'nicknames' => array_values($nicknames),
)
);


//Если нет имен то выходим из функции
if($smcFunc['db_num_rows']($result_members) == 0) return;

//собираем все ИД пользователей
$ids_members = array();
while($member = $smcFunc['db_fetch_assoc']($result_members)){
$ids_members[] = $member['id'];
}
$ids_members = array_unique($ids_members);


//Добавить в таблицу smf_nick_quote данные  / ид того кто постит / ид того кого упомянули / ид сообщения
foreach($ids_members AS $id){
if($user_info['id'] != $id){
$smcFunc['db_insert']('ignore',
'{db_prefix}nick_event',
array('poster_id' => 'int', 'mention_id' => 'int', 'id_msg' => 'int'),
array($user_info['id'], $id, $id_msg),
array('id')
);
}
}

}


function get_newents(){
global $smcFunc, $context, $user_info, $scripturl, $modSettings;

if($user_info['is_guest'])return;

$newents = 0;

$cache_id = 'newents'. $user_info['id'];

if (!empty($modSettings['cache_enable'])) $newents = cache_get_data($cache_id);

if (!isset($newents) || !is_int($newents)) {

//строка запроса
$sql_string = '
FROM {db_prefix}nick_event AS ne
LEFT JOIN {db_prefix}members AS mp ON (mp.id_member = ne.poster_id)
LEFT JOIN {db_prefix}messages AS msg ON (msg.id_msg = ne.id_msg)
WHERE ne.mention_id = {int:mention_id}';

//подсчитываем общее количество
$result_count = $smcFunc['db_query']('', '
SELECT COUNT(*) as count
' . $sql_string . '',
array(
'mention_id' => $user_info['id'],
));
list($newents) = $smcFunc['db_fetch_row']($result_count);

if (!empty($modSettings['cache_enable'])) cache_put_data($cache_id, (int)$newents, 30);

}

return $newents;
}

//NickEvent end

Есть мелкая ошибка в формировании URL для перехода на следующую страницу.
Код
//ToDo - вынести куда надо/оформить настройки как то по другому
$modSettings['newentPerPage'] = 27;
$context['newent_url'] = 'action=newent';
заменить на
Код
//ToDo - вынести куда надо/оформить настройки как то по другому
$modSettings['newentPerPage'] = 27;
$context['newent_url'] = '?action=newent';