Хотел получить для шаблона переменную с количеством непрочитанных. Нашел вариант только для старых версий, вроде этого: http://phpbbandbbcodes.com/viewtopic.php?f=3&t=1701
Оно естественно не работает, вываливает ошибки, чатгпт этот код увы адаптировать не могёт, я тем более.
Немного подумал, для крупного ресурса подсчет непрочитанных, вероятно, может быть трудозатратен. Логической переменной, есть/нет для непрочитанных тоже бы хватило. Но и с этим AI не смог справиться. Расширение создает с неполной структурой. Но фиг с ней со структурой, её и STK прекрасно делает, но даже через правки кода у ИИ не хватило способностей... ну или может у меня объяснить ему что я хочу. Причем чатгпт и дипсик предлагают тотально разные варианты кода :shock:
Поэтому обращаюсь к существам живым, подскажите, пожалуйста, как это реализовать. Или если где-то встречали - поделитесь плз ссылкой на расширение.
Подсчет количества непрочитанных сообщений или просто флажок есть/нет
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение

-
- phpBB 2.0.22
- Сообщения: 1371
- Стаж: 16 лет 2 месяца
- Благодарил (а): 165 раз
- Поблагодарили: 20 раз
Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет
Смог реализовать для главной:
function_display - добавляю функцию:
В index.php добавляю:
Работает только для главной. Можно сделать также для search.php, viewtopic.php и так далее, но как сделать это глобально, чтобы работало на всех страницах форума?
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;
}
Код: Выделить всё
$has_unread = unread_posts_exist($db, $auth, $user);
$template->assign_var('S_UNREAD_POSTS_EXIST', $has_unread);
-
- phpBB Guru
- Сообщения: 17002
- Стаж: 19 лет 1 месяц
- Откуда: Красноярск
- Благодарил (а): 559 раз
- Поблагодарили: 1714 раз
Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет
Очевидно, вывести переменную шаблона в
includes/functions.php
в функции page_header.php
.-
- Поддержка
- Сообщения: 5448
- Стаж: 20 лет 5 месяцев
- Откуда: Питер
- Благодарил (а): 179 раз
- Поблагодарили: 756 раз
Re: Подсчет количества непрочитанных сообщений или просто флажок есть/нет
romeo_piter, В расширении Mark Post Unread есть такая фича. При его активации также добавляется счётчик числа непрочитанных в верхнем меню, если это включено в админке.
Как вариант, можете посмотреть как там это реализовано.
Как вариант, можете посмотреть как там это реализовано.
Код: Выделить всё
/**
* 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 (phpbb2.0.x 3.5.x)
Ты очистил кеш? © Sheer
https://siava.ru (phpbb