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

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

« назад - далее »

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

sibrus

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


sibrus

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

Yarik

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

kak2z

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

Yarik

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

sibrus

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

Yarik

Цитата: 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 endfunction 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В самом верху оповещения так и называются.

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

Yarik

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

sibrus

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

Yarik

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

Serifa

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

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

Yarik

Цитата: 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';