Таблица phpbb_topics_watch

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Таблица phpbb_topics_watch

Сообщение ferdinand »

Понаблюдал, как при добавлении сообщений с галкой "уведомлять о новых" в quick reply форме и в обычной форме, меняется содержимое таблицы. И понял, что никак не меняется.

"Слежение" за темами начинается только при нажатии на ссылку "следить за сообщениями" внизу темы, но при этом в таблицу добавляется в поле notify_status не 1, а 0. В файле viewtopic.php поменял соответствующий код, изменив добавление 0 на 1, результата не дало.

Проблема: не позволяет следить за новыми темами и не присылает уведомления по почте.
Помогите решить, пожалуйста.
Поиском пользовался, похожее находил, но не то.
Хотя бы подскажите в каком месте искать неверный код и от чего отталкиваться
Последний раз редактировалось ferdinand 10.05.2006 13:25, всего редактировалось 1 раз.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Судя по названию таблицы у вас установлен мод слежки за новыми темами. С уведомлениями на что конкретно у вас проблемы?
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Сообщение ferdinand »

Прошу меня извинить, пост писал ночью. Конечно же у меня таблица phpbb_topics_watch.

Модулей установлено достаточно большое количество. В свое время переносил базу еще из-под phpnuke. Проблема в том, что не работает уведомление на почту о новых сообщениях в теме и не заносятся данные в эту таблицу, если при отправке сообщения ставить галку "следить за сообщениями"
Уведомления о личных сообщениях приходят
Как я понял, на это может влиять достаточно большое количество кода в разных скриптах. Подскажите, где копать?

template: SubSilver
phpBB v2.0.19
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

ferdinand
Почитайте тему "Письма с форума индексируются как спам", похожу у вас сервер не приемлет заголовок To, который выдается форумом.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Сообщение ferdinand »

Xpert
Исключено. Я вижу, что в таблицу записываются неправильные данные или вообще не записываются.

Некоторое время мне приходили уведомления о трех темах, записи о которых еще оставались в таблице с предыдущих времен. Как только я для чистоты эксперимента стер эти три строки из таблицы, перестали. Не в почте дело.

Просто хочется узнать точно, какой код отвечает за подписку на тему (из формы быстрого ответа, из формы ответа и по ссылке внизу темы), а также какой код отсылает уведомления.

Помогите хотя бы этим, сам найти я не смог

Добавлено спустя 4 минуты 18 секунд:

Даже при подписывании на тему, в таблицу добавляется 0 вместо 1 в поле статуса

Добавлено спустя 26 минут 59 секунд:

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

Добавлено спустя 3 часа 56 минут 24 секунды:

Сверил файлы functions_post.php, posting.php, viewtopic.php в местах с переменными уведомления с дистрибутивом phpbb v2.0.20. На свой взгляд различий не нашел.

Добавлено спустя 2 часа 51 минуту 41 секунду:

Проблема немного локализована. Форум стал отправлять уведомления о новых сообщениях в теме только при подписке по ссылке внизу темы. При отправке сообщения (создании поста, ответе на пост) подписка на уведомления не происходит (в базу ничего не пишет).
А еще {TOPIC_TITLE} в письме не отображает...

Мне кто-нибудь поможет?
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

ferdinand писал(а):Мне кто-нибудь поможет?
Да, но про пункт 3.5 правил форума просьба не забывать.
ferdinand писал(а): При отправке сообщения (создании поста, ответе на пост) подписка на уведомления не происходит (в базу ничего не пишет).
Это при ответе через быстрый ответ? Очень может быть, это глюк мода ответа...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Сообщение ferdinand »

Xpert писал(а):Это при ответе через быстрый ответ? Очень может быть, это глюк мода ответа...
Нет, это как я уже написал при создании темы или ответе. Без разницы, через быстрый ответ или через нормальный.

Добавлено спустя 1 минуту 7 секунд:

И еще.
Переменные USERNAME, POSTER_USERNAME, TOPIC_TITLE в уведомлении пусты

Добавлено спустя 1 час 24 секунды:

Любопытное наблюдение. Внес в таблицу в поле notify_status 0 (что, как я теперь выяснил соответствует подписке на тему, а вот 1 - подписке с уведомлениями, по которым не сделан переход) и как только я отвечаю в этой же теме с автоматически установленной галкой "получать уведомления", строка из таблицы удаляется.
Видимо, где-то в posting.php неправильно распознаются поля формы отправки (и быстрой формы тоже)

А все переменные кроме ссылки на тему и ссылки на отписку от темы нулевые.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

За это в posting.php отвечает вызов следующей функции:

Код: Выделить всё

			user_notification($mode, $post_data, $post_info['topic_title'], $forum_id, $topic_id, $post_id, $notify_user);
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Сообщение ferdinand »

В posting.php код у меня такой же.

В functions_post.php функция описана так:

Код: Выделить всё

//
// Handle user notification on new post
//
function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topic_id, &$post_id, &$notify_user)
{
	global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
	global $userdata, $user_ip;

	$current_time = time();

	if ($mode != 'delete')
	{
		if ($mode == 'reply')
		{
			$sql = "SELECT ban_userid 
				FROM " . BANLIST_TABLE;
			if (!($result = $db->sql_query($sql)))
			{
				message_die(GENERAL_ERROR, 'Could not obtain banlist', '', __LINE__, __FILE__, $sql);
			}

			$user_id_sql = '';
			while ($row = $db->sql_fetchrow($result))
			{
				if (isset($row['ban_userid']) && !empty($row['ban_userid']))
				{
					$user_id_sql .= ', ' . $row['ban_userid'];
				}
			}

			$sql = "SELECT u.user_id, u.user_email, u.user_lang 
				FROM " . TOPICS_WATCH_TABLE . " tw, " . USERS_TABLE . " u 
				WHERE tw.topic_id = $topic_id 
					AND tw.user_id NOT IN (" . $userdata['user_id'] . ", " . ANONYMOUS . $user_id_sql . ") 
					AND tw.notify_status = " . TOPIC_WATCH_UN_NOTIFIED . " 
					AND u.user_id = tw.user_id";
			if (!($result = $db->sql_query($sql)))
			{
				message_die(GENERAL_ERROR, 'Could not obtain list of topic watchers', '', __LINE__, __FILE__, $sql);
			}

			$update_watched_sql = '';
			$bcc_list_ary = array();
			
			if ($row = $db->sql_fetchrow($result))
			{
				// Sixty second limit
				@set_time_limit(60);

				do
				{
					if ($row['user_email'] != '')
					{
						$bcc_list_ary[$row['user_lang']][] = $row['user_email'];
					}
					$update_watched_sql .= ($update_watched_sql != '') ? ', ' . $row['user_id'] : $row['user_id'];
				}
				while ($row = $db->sql_fetchrow($result));

				//
				// Let's do some checking to make sure that mass mail functions
				// are working in win32 versions of php.
				//
				if (preg_match('/[c-z]:\\\.*/i', getenv('PATH')) && !$board_config['smtp_delivery'])
				{
					$ini_val = (@phpversion() >= '4.0.0') ? 'ini_get' : 'get_cfg_var';

					// We are running on windows, force delivery to use our smtp functions
					// since php's are broken by default
					$board_config['smtp_delivery'] = 1;
					$board_config['smtp_host'] = @$ini_val('SMTP');
				}

				if (sizeof($bcc_list_ary))
				{
					include($phpbb_root_path . 'includes/emailer.'.$phpEx);
					$emailer = new emailer($board_config['smtp_delivery']);

					$script_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($board_config['script_path']));
					$script_name = ($script_name != '') ? $script_name . '/viewtopic.'.$phpEx : 'viewtopic.'.$phpEx;
					$server_name = trim($board_config['server_name']);
					$server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
					$server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) . '/' : '/';

					$orig_word = array();
					$replacement_word = array();
					obtain_word_list($orig_word, $replacement_word);

					$emailer->from($board_config['board_email']);
					$emailer->replyto($board_config['board_email']);

					if ($post_data['poster_id'] != ANONYMOUS) 
              			{ 
                  			$sql = "SELECT username 
                     			FROM " . USERS_TABLE . " 
                     			WHERE user_id = " . $post_data['poster_id']; 
                  			$result = $db->sql_query($sql); 
                  			$result = $db->sql_fetchrow($sql); 
                  			$username = $result['username']; 
               			} 
               			else 
               			{ 
                  			$username = ($post_data['poster_username']) ? $post_data['poster_username'] : $lang['Guest']; 
               			} 
               			//by me
					//$username = (count($orig_word)) ? preg_replace($orig_word, $replacement_word, unprepare_message($username)) : unprepare_message($username); 



					@reset($bcc_list_ary);
					while (list($user_lang, $bcc_list) = each($bcc_list_ary))
					{
						$emailer->use_template('topic_notify', $user_lang);
		
						for ($i = 0; $i < count($bcc_list); $i++)
						{
							$emailer->bcc($bcc_list[$i]);
						}

						// The Topic_reply_notification lang string below will be used
						// if for some reason the mail template subject cannot be read 
						// ... note it will not necessarily be in the posters own language!
						$emailer->set_subject($lang['Topic_reply_notification']); 
						
						// This is a nasty kludge to remove the username var ... till (if?)
						// translators update their templates

						$emailer->assign_vars(array(
							'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
							'SITENAME' => $board_config['sitename'],
							'TOPIC_TITLE' => stripslashes($topic_title),
							'USERNAME' => $username, 

							'U_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_POST_URL . "=$post_id#$post_id",
							'U_STOP_WATCHING_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_TOPIC_URL . "=$topic_id&unwatch=topic")
						);

						$emailer->send();
						$emailer->reset();
					}
				}
			}
			$db->sql_freeresult($result);

			if ($update_watched_sql != '')
			{
				$sql = "UPDATE " . TOPICS_WATCH_TABLE . "
					SET notify_status = " . TOPIC_WATCH_NOTIFIED . "
					WHERE topic_id = $topic_id
						AND user_id IN ($update_watched_sql)";
				$db->sql_query($sql);
			}
		}

		$sql = "SELECT topic_id 
			FROM " . TOPICS_WATCH_TABLE . "
			WHERE topic_id = $topic_id
				AND user_id = " . $userdata['user_id'];
		if (!($result = $db->sql_query($sql)))
		{
			message_die(GENERAL_ERROR, 'Could not obtain topic watch information', '', __LINE__, __FILE__, $sql);
		}

		$row = $db->sql_fetchrow($result);

		if (!$notify_user && !empty($row['topic_id']))
		{
			$sql = "DELETE FROM " . TOPICS_WATCH_TABLE . "
				WHERE topic_id = $topic_id
					AND user_id = " . $userdata['user_id'];
			if (!$db->sql_query($sql))
			{
				message_die(GENERAL_ERROR, 'Could not delete topic watch information', '', __LINE__, __FILE__, $sql);
			}
		}
		else if ($notify_user && empty($row['topic_id']))
		{
			$sql = "INSERT INTO " . TOPICS_WATCH_TABLE . " (user_id, topic_id, notify_status)
				VALUES (" . $userdata['user_id'] . ", $topic_id, 0)";
			if (!$db->sql_query($sql))
			{
				message_die(GENERAL_ERROR, 'Could not insert topic watch information', '', __LINE__, __FILE__, $sql);
			}
		}
	}
}
Извините, если что не так делаю, я совсем с этой проблемой запутался
ferdinand
phpBB 1.2.1
Сообщения: 21
Стаж: 19 лет
Откуда: Москва

Сообщение ferdinand »

Проблема странная. Переменная $notify_user после передачи из формы переменной notify успешно определяется.
Код сравнивал с дистрибутивом построчно.
Но все равно после отправки сообщения не желает ставить галку "следить за темой"

Вернуться в «Поддержка phpBB 2.0.x»