Подсчет количества непрочитанных сообщений или просто флажок есть/нет

Вопросы без привязки к версии. Установлена авточистка (2 года).
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
romeo_piter
phpBB 2.0.22
Сообщения: 1371
Стаж: 16 лет 2 месяца
Благодарил (а): 165 раз
Поблагодарили: 20 раз

Подсчет количества непрочитанных сообщений или просто флажок есть/нет

Сообщение romeo_piter »

Хотел получить для шаблона переменную с количеством непрочитанных. Нашел вариант только для старых версий, вроде этого: http://phpbbandbbcodes.com/viewtopic.php?f=3&t=1701
Оно естественно не работает, вываливает ошибки, чатгпт этот код увы адаптировать не могёт, я тем более.

Немного подумал, для крупного ресурса подсчет непрочитанных, вероятно, может быть трудозатратен. Логической переменной, есть/нет для непрочитанных тоже бы хватило. Но и с этим AI не смог справиться. Расширение создает с неполной структурой. Но фиг с ней со структурой, её и STK прекрасно делает, но даже через правки кода у ИИ не хватило способностей... ну или может у меня объяснить ему что я хочу. Причем чатгпт и дипсик предлагают тотально разные варианты кода :shock:

Поэтому обращаюсь к существам живым, подскажите, пожалуйста, как это реализовать. Или если где-то встречали - поделитесь плз ссылкой на расширение.
romeo_piter
phpBB 2.0.22
Сообщения: 1371
Стаж: 16 лет 2 месяца
Благодарил (а): 165 раз
Поблагодарили: 20 раз

Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет

Сообщение romeo_piter »

Смог реализовать для главной:

function_display - добавляю функцию:

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

function unread_posts_exist(\phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\user $user)
{
    if (!$user->data['is_registered'])
    {
        return false;
    }

    $ex_fid_ary = array_unique(array_merge(
        array_keys($auth->acl_getf('!f_read', true)),
        array_keys($auth->acl_getf('!f_search', true))
    ));

    $sql = '
        SELECT t.topic_id, p.post_time,
               tt.mark_time AS topic_mark,
               ft.mark_time AS forum_mark
        FROM ' . TOPICS_TABLE . ' t
        JOIN ' . POSTS_TABLE . ' p ON p.post_id = t.topic_last_post_id
        LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON tt.topic_id = t.topic_id AND tt.user_id = ' . (int) $user->data['user_id'] . '
        LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON ft.forum_id = t.forum_id AND ft.user_id = ' . (int) $user->data['user_id'] . '
        WHERE t.topic_moved_id = 0
            ' . (!empty($ex_fid_ary) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
        ORDER BY p.post_time DESC
        LIMIT 20';

    $result = $db->sql_query($sql);
    $has_unread = false;

    while ($row = $db->sql_fetchrow($result))
    {
        $latest_read = max(
            (int) $row['topic_mark'],
            (int) $row['forum_mark'],
            (int) $user->data['user_lastmark']
        );

        if ((int) $row['post_time'] > $latest_read)
        {
            $has_unread = true;
            break;
        }
    }
    $db->sql_freeresult($result);

    return $has_unread;
}
В index.php добавляю:

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

$has_unread = unread_posts_exist($db, $auth, $user);
$template->assign_var('S_UNREAD_POSTS_EXIST', $has_unread);
Работает только для главной. Можно сделать также для search.php, viewtopic.php и так далее, но как сделать это глобально, чтобы работало на всех страницах форума?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17002
Стаж: 19 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 559 раз
Поблагодарили: 1714 раз

Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет

Сообщение rxu »

romeo_piter писал(а): 22.06.2025 4:46 чтобы работало на всех страницах форума?
Очевидно, вывести переменную шаблона в includes/functions.php в функции page_header.php.
Изображение
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5448
Стаж: 20 лет 5 месяцев
Откуда: Питер
Благодарил (а): 179 раз
Поблагодарили: 756 раз

Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет

Сообщение Siava »

romeo_piter, В расширении Mark Post Unread есть такая фича. При его активации также добавляется счётчик числа непрочитанных в верхнем меню, если это включено в админке.
sshot-271.png
Как вариант, можете посмотреть как там это реализовано.

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

	/**
	 * Event: core.get_unread_topics_modify_sql
	 *
	 * @param data $event
	 */
	 public function adjust_get_unread_topics_sql($event)
	{
		if ($this->core->cfg('unread_posts_link'))
		{
			$sql_array = $event['sql_array'];
			$last_mark = (int) $event['last_mark'];
			$sql_extra = $event['sql_extra'];
			$sql_sort = $event['sql_sort'];
			$sql_array['WHERE'] = "
				(
					(tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR
					(tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR
					(tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > $last_mark)
				)
				$sql_extra
				$sql_sort";
			$event['sql_array'] = $sql_array;
		}
	}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)

Вернуться в «phpBB-пространство»