<?php
/**
* This file is part of JohnCMS Content Management System.
*
* @copyright JohnCMS Community
* @license https://opensource.org/licenses/GPL-3.0 GPL-3.0
* @link https://johncms.com JohnCMS Project
*/
declare(strict_types=1);
defined('_IN_JOHNCMS') || die('Error: restricted access');
/**
* @var PDO $db
* @var Johncms\System\Legacy\Tools $tools
* @var Johncms\System\Users\User $user
*/
unset($_SESSION['fsort_id'], $_SESSION['fsort_users']);
if (empty($_SESSION['uid'])) {
if (isset($_GET['newup'])) {
$_SESSION['uppost'] = 1;
}
if (isset($_GET['newdown'])) {
$_SESSION['uppost'] = 0;
}
}
if ($user->isValid()) {
switch ($do) {
case 'reset':
// Отмечаем все темы как прочитанные
$ids = $db->query(
"SELECT `forum_topic`.`id`, `forum_topic`.`last_post_date`
FROM `forum_topic` LEFT JOIN `cms_forum_rdm` ON `forum_topic`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $user->id . "'
WHERE `forum_topic`.`last_post_date` > `cms_forum_rdm`.`time` OR `cms_forum_rdm`.`topic_id` IS NULL"
)->fetchAll(PDO::FETCH_ASSOC);
if (! empty($ids)) {
foreach ($ids as $val) {
$values[] = '(' . $val['id'] . ', ' . $user->id . ', ' . $val['last_post_date'] . ')';
}
$db->query(
'INSERT INTO cms_forum_rdm (topic_id, user_id, `time`) VALUES ' . implode(',', $values) . '
ON DUPLICATE KEY UPDATE `time` = VALUES(`time`)'
);
}
echo $view->render(
'system::pages/result',
[
'title' => __('Unread'),
'type' => 'alert-success',
'message' => __('All topics marked as read'),
'back_url' => '/forum/',
'back_url_name' => __('Forum'),
]
);
break;
case 'period':
// Показ новых тем за выбранный период
$vr = isset($_REQUEST['vr']) ? abs((int) ($_REQUEST['vr'])) : 24;
$vr1 = time() - $vr * 3600;
if ($user->rights == 9) {
$sql = 'SELECT COUNT(*) FROM `forum_topic` WHERE `mod_last_post_date` > ?';
$sql2 = 'SELECT tpc.*, rzd.`name` AS rzd_name, frm.`name` AS frm_name
FROM `forum_topic` tpc
LEFT JOIN forum_sections rzd ON rzd.id = tpc.section_id
LEFT JOIN forum_sections frm ON frm.id = rzd.parent
WHERE `mod_last_post_date` > ? ORDER BY `mod_last_post_date` DESC LIMIT ?, ?';
} else {
$sql = 'SELECT COUNT(*) FROM `forum_topic` WHERE `last_post_date` > ? AND (`deleted` <> 1 OR deleted IS NULL)';
$sql2 = 'SELECT tpc.*, rzd.`name` AS rzd_name, frm.`name` AS frm_name
FROM `forum_topic` tpc
LEFT JOIN forum_sections rzd ON rzd.id = tpc.section_id
LEFT JOIN forum_sections frm ON frm.id = rzd.parent
WHERE `last_post_date` > ? AND (`deleted` <> 1 OR deleted IS NULL) ORDER BY `last_post_date` DESC LIMIT ?, ?';
}
$sth = $db->prepare($sql);
$sth->execute([$vr1]);
$count = $sth->fetchColumn();
if ($count) {
$param = array_merge([$vr1], [$start, $user->config->kmess]);
$req = $db->prepare($sql2);
$req->execute($param);
$topics = [];
while ($res = $req->fetch()) {
if ($user->rights >= 7) {
$cpg = ceil($res['mod_post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['mod_post_count']);
$res['show_last_author'] = $res['mod_last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['mod_last_post_date']);
} else {
$cpg = ceil($res['post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['post_count']);
$res['show_last_author'] = $res['last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['last_post_date']);
}
$res['has_icons'] = ($res['pinned'] || $res['has_poll'] || $res['closed'] || $res['deleted']);
$res['url'] = '/forum/?type=topic&id=' . $res['id'];
// Url to last page
$res['last_page_url'] = $res['url'];
if ($cpg > 1) {
$res['last_page_url'] = '/forum/?type=topic&id=' . $res['id'] . '&page=' . $cpg;
}
$topics[] = $res;
}
}
echo $view->render(
'forum::new_topics',
[
'pagination' => $tools->displayPagination('/forum/?act=new&do=period&vr=' . $vr . '&', $start, $count, $user->config->kmess),
'title' => sprintf(__('All for period %d hours'), $vr),
'page_title' => sprintf(__('All for period %d hours'), $vr),
'empty_message' => __('There is nothing new in this forum for selected period'),
'topics' => $topics ?? [],
'total' => $count,
'show_period' => true,
]
);
break;
default:
// Вывод непрочитанных тем (для зарегистрированных)
$total = di('counters')->forumNew();
if ($total > 0) {
$req = $db->query(
"SELECT tpc.*, rzd.`name` AS rzd_name, frm.id as frm_id, frm.`name` AS frm_name
FROM `forum_topic` tpc
LEFT JOIN `cms_forum_rdm` rdm ON `tpc`.`id` = `rdm`.`topic_id` AND `rdm`.`user_id` = '" . $user->id . "'
LEFT JOIN forum_sections rzd ON rzd.id = tpc.section_id
LEFT JOIN forum_sections frm ON frm.id = rzd.parent
WHERE " . ($user->rights >= 7 ? '' : "(`tpc`.`deleted` <> '1' OR `tpc`.`deleted` IS NULL) AND ") . "(`rdm`.`topic_id` IS NULL OR `tpc`.`last_post_date` > `rdm`.`time`)
ORDER BY `tpc`.`last_post_date` DESC LIMIT ${start}, " . $user->config->kmess
);
$topics = [];
while ($res = $req->fetch()) {
if ($user->rights >= 7) {
$cpg = ceil($res['mod_post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['mod_post_count']);
$res['show_last_author'] = $res['mod_last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['mod_last_post_date']);
} else {
$cpg = ceil($res['post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['post_count']);
$res['show_last_author'] = $res['last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['last_post_date']);
}
$res['has_icons'] = ($res['pinned'] || $res['has_poll'] || $res['closed'] || $res['deleted']);
$res['url'] = '/forum/?type=topic&id=' . $res['id'];
// Url to last page
$res['last_page_url'] = $res['url'];
if ($cpg > 1) {
$res['last_page_url'] = '/forum/?type=topic&id=' . $res['id'] . '&page=' . $cpg;
}
$res['forum_url'] = '';
if (! empty($res['frm_id'])) {
$res['forum_url'] = '/forum/?id=' . $res['frm_id'];
}
$res['section_url'] = '';
if (! empty($res['section_id'])) {
$res['section_url'] = '/forum/?type=topics&id=' . $res['section_id'];
}
$topics[] = $res;
}
}
echo $view->render(
'forum::new_topics',
[
'pagination' => $tools->displayPagination('?act=new&', $start, $total, $user->config->kmess),
'title' => __('Unread'),
'page_title' => __('Unread'),
'empty_message' => __('The list is empty'),
'topics' => $topics ?? [],
'total' => $total,
'show_period' => false,
'mark_as_read' => '?act=new&do=reset',
]
);
break;
}
} else {
// Вывод 10 последних тем (для незарегистрированных)
$req = $db->query(
'SELECT tpc.*, rzd.`name` AS rzd_name, frm.`name` AS frm_name
FROM `forum_topic` tpc
LEFT JOIN forum_sections rzd ON rzd.id = tpc.section_id
LEFT JOIN forum_sections frm ON frm.id = rzd.parent
WHERE (`deleted` <> 1 OR deleted IS NULL)
ORDER BY `last_post_date` DESC LIMIT 10'
);
$total = $req->rowCount();
if ($total) {
$topics = [];
while ($res = $req->fetch()) {
if ($user->rights >= 7) {
$cpg = ceil($res['mod_post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['mod_post_count']);
$res['show_last_author'] = $res['mod_last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['mod_last_post_date']);
} else {
$cpg = ceil($res['post_count'] / $user->config->kmess);
$res['show_posts_count'] = $tools->formatNumber($res['post_count']);
$res['show_last_author'] = $res['last_post_author_name'];
$res['show_last_post_date'] = $tools->displayDate($res['last_post_date']);
}
$res['has_icons'] = ($res['pinned'] || $res['has_poll'] || $res['closed'] || $res['deleted']);
$res['url'] = '/forum/?type=topic&id=' . $res['id'];
// Url to last page
$res['last_page_url'] = $res['url'];
if ($cpg > 1) {
$res['last_page_url'] = '/forum/?type=topic&id=' . $res['id'] . '&page=' . $cpg;
}
$res['forum_url'] = '';
if (! empty($res['frm_id'])) {
$res['forum_url'] = '/forum/?id=' . $res['frm_id'];
}
$res['section_url'] = '';
if (! empty($res['section_id'])) {
$res['section_url'] = '/forum/?type=topics&id=' . $res['section_id'];
}
$topics[] = $res;
}
}
echo $view->render(
'forum::new_topics',
[
'pagination' => '',
'title' => __('Last 10'),
'page_title' => __('Last 10'),
'empty_message' => __('The list is empty'),
'topics' => $topics ?? [],
'total' => $total,
'show_period' => false,
]
);
}