diff --git a/assets/less/mio/classes/forum/listing.less b/assets/less/mio/classes/forum/listing.less index e7fed508..a8f6213d 100644 --- a/assets/less/mio/classes/forum/listing.less +++ b/assets/less/mio/classes/forum/listing.less @@ -58,11 +58,9 @@ } &__stats { - text-align: right; + text-align: center; flex-grow: 0; flex-shrink: 0; - font-style: italic; - font-family: Verdana, Arial, Helvetica, sans-serif; @media (max-width: @mio-forum-listing-mobile) { display: none; diff --git a/assets/less/mio/classes/forum/topics.less b/assets/less/mio/classes/forum/topics.less index b8543509..5e166cf7 100644 --- a/assets/less/mio/classes/forum/topics.less +++ b/assets/less/mio/classes/forum/topics.less @@ -30,7 +30,11 @@ flex-grow: 1; flex-shrink: 1; padding: 0 2px; + } + &__info, + &__activity { + &__datetime, &__title { &__link { text-decoration: none; @@ -50,7 +54,7 @@ font-size: .9em; line-height: 1.3em; - &__username { + &__name { color: inherit; font-weight: 700; text-decoration: none; @@ -79,18 +83,22 @@ &__stats { text-align: center; + padding-left: 1px; } - &__last-post { + &__activity { min-width: 200px; + padding-left: 3px; } &__stats, - &__last-post { + &__activity { + display: inline-flex; + flex-direction: column; + justify-content: center; flex-shrink: 0; flex-grow: 0; border-left: 1px solid #9475b2; - padding-left: 1px; } } } diff --git a/assets/less/mio/classes/news/list.less b/assets/less/mio/classes/news/list.less index 75545549..b0ff157a 100644 --- a/assets/less/mio/classes/news/list.less +++ b/assets/less/mio/classes/news/list.less @@ -1,6 +1,7 @@ .news__list { margin: 0; margin-bottom: 2px; + box-shadow: initial; &__item { text-decoration: none; diff --git a/assets/less/mio/classes/news/preview.less b/assets/less/mio/classes/news/preview.less index 18ea6914..e6492b6f 100644 --- a/assets/less/mio/classes/news/preview.less +++ b/assets/less/mio/classes/news/preview.less @@ -1,5 +1,6 @@ .news__preview { margin: 0; + box-shadow: initial; &:not(:last-child) { margin-bottom: 2px; diff --git a/assets/less/mio/classes/news/pagination.less b/assets/less/mio/classes/pagination.less similarity index 94% rename from assets/less/mio/classes/news/pagination.less rename to assets/less/mio/classes/pagination.less index 90711f49..1a7b356d 100644 --- a/assets/less/mio/classes/news/pagination.less +++ b/assets/less/mio/classes/pagination.less @@ -1,8 +1,8 @@ -.news__pagination { - border: 1px solid #9475b2; +.pagination { list-style: none; display: flex; padding: 1px; + border: 1px solid #9475b2; &__separator { flex-grow: 1; @@ -15,7 +15,7 @@ height: 20px; width: 20px; - &:not(:last-child){ + &:not(:last-child) { margin-right: 1px; } diff --git a/assets/less/mio/classes/settings/pagination.less b/assets/less/mio/classes/settings/pagination.less index 46fdcced..15740af2 100644 --- a/assets/less/mio/classes/settings/pagination.less +++ b/assets/less/mio/classes/settings/pagination.less @@ -1,54 +1,4 @@ .settings__pagination { - list-style: none; - display: flex; max-width: 400px; margin: 2px auto; - padding: 1px; - border: 1px solid #9475b2; - - &__separator { - flex-grow: 1; - flex-shrink: 1; - } - - &__option { - background: #9475b2; - color: #306; - height: 20px; - width: 20px; - - &:not(:last-child){ - margin-right: 1px; - } - - &--disabled { - color: #383838; - background: #777; - } - - @media (max-width: @mio-news-mobile) { - height: 30px; - width: 30px; - font-size: 1.5em; - line-height: 1.5em; - } - } - - &__link { - display: block; - width: 100%; - height: 100%; - text-align: center; - text-decoration: none; - color: inherit; - - &--prev, - &--next, - &--first, - &--last, - &--active, - &:hover { - font-weight: bold; - } - } } diff --git a/assets/less/mio/main.less b/assets/less/mio/main.less index ea9b040b..0451ad1b 100644 --- a/assets/less/mio/main.less +++ b/assets/less/mio/main.less @@ -45,11 +45,12 @@ body { @import "classes/avatar"; @import "classes/container"; @import "classes/heading"; +@import "classes/navigation"; +@import "classes/pagination"; // Specific styles @import "classes/footer"; @import "classes/header"; -@import "classes/navigation"; @import "classes/profile"; // Settings @@ -65,7 +66,6 @@ body { // News @import "classes/news/container"; @import "classes/news/list"; -@import "classes/news/pagination"; @import "classes/news/preview"; @import "classes/news/sidebar"; @import "classes/news/post"; // post needs to be able to override sidebar diff --git a/public/auth.php b/public/auth.php index e15ebfc5..464e4a4f 100644 --- a/public/auth.php +++ b/public/auth.php @@ -67,8 +67,7 @@ switch ($mode) { $auth_login_error = ''; while ($_SERVER['REQUEST_METHOD'] === 'POST') { - $ipAddressObj = IPAddress::remote(); - $ipAddress = $ipAddressObj->getString(); + $ipAddress = IPAddress::remote()->getString(); if (!isset($_POST['username'], $_POST['password'])) { $auth_login_error = "You didn't fill all the forms!"; @@ -127,12 +126,19 @@ switch ($mode) { $createSession = $db->prepare(' INSERT INTO `msz_sessions` - (`user_id`, `session_ip`, `user_agent`, `session_key`, `created_at`, `expires_on`) + ( + `user_id`, `session_ip`, `session_country`, + `user_agent`, `session_key`, `created_at`, `expires_on` + ) VALUES - (:user_id, INET6_ATON(:session_ip), :user_agent, :session_key, NOW(), NOW() + INTERVAL 1 MONTH) + ( + :user_id, INET6_ATON(:session_ip), :session_country, + :user_agent, :session_key, NOW(), NOW() + INTERVAL 1 MONTH + ) '); $createSession->bindValue('user_id', $userId); $createSession->bindValue('session_ip', $ipAddress); + $createSession->bindValue('session_country', get_country_code($ipAddress)); $createSession->bindValue('user_agent', $user_agent); $createSession->bindValue('session_key', $sessionKey); diff --git a/public/forum/forum.php b/public/forum/forum.php index 11ba828b..23b67350 100644 --- a/public/forum/forum.php +++ b/public/forum/forum.php @@ -112,15 +112,14 @@ $getBreadcrumb = $db->prepare(' while ($lastParent > 0) { $getBreadcrumb->bindValue('forum_id', $lastParent); + $breadcrumb = $getBreadcrumb->execute() ? $getBreadcrumb->fetch() : []; - if (!$getBreadcrumb->execute()) { + if (!$breadcrumb) { break; } - $parentForum = $getBreadcrumb->fetch(); - - $breadcrumbs[$parentForum['forum_name']] = '/forum/forum.php?f=' . $parentForum['forum_id']; - $lastParent = $parentForum['forum_parent']; + $breadcrumbs[$breadcrumb['forum_name']] = '/forum/forum.php?f=' . $breadcrumb['forum_id']; + $lastParent = $breadcrumb['forum_parent']; } $breadcrumbs['Forums'] = '/forum/'; diff --git a/public/forum/topic.php b/public/forum/topic.php index cedc4248..0adfe2a8 100644 --- a/public/forum/topic.php +++ b/public/forum/topic.php @@ -3,4 +3,81 @@ use Misuzu\Database; require_once __DIR__ . '/../../misuzu.php'; -echo $app->getTemplating()->render('forum.topic'); +$db = Database::connection(); +$templating = $app->getTemplating(); + +$postId = (int)($_GET['p'] ?? 0); +$topicId = (int)($_GET['t'] ?? 0); +$postsOffset = max((int)($_GET['o'] ?? 0), 0); +$postsRange = max(min((int)($_GET['r'] ?? 10), 25), 5); + +// find topic id +if ($topicId < 1 && $postId > 0) { + $getTopicId = $db->prepare(' + SELECT `topic_id` + FROM `msz_forum_posts` + WHERE `post_id` = :post_id + '); + $getTopicId->bindValue('post_id', $postId); + $topicId = $getTopicId->execute() ? (int)$getTopicId->fetchColumn() : 0; +} + +$getTopic = $db->prepare(' + SELECT + t.`topic_id`, t.`forum_id`, t.`topic_title`, t.`topic_type`, t.`topic_status`, + ( + SELECT MIN(p.`post_id`) + FROM `msz_forum_posts` as p + WHERE p.`topic_id` = t.`topic_id` + ) as `topic_first_post_id` + FROM `msz_forum_topics` as t + WHERE t.`topic_id` = :topic_id + AND t.`topic_deleted` IS NULL +'); +$getTopic->bindValue('topic_id', $topicId); +$topic = $getTopic->execute() ? $getTopic->fetch() : false; + +if (!$topic) { + http_response_code(404); + echo $templating->render('errors.404'); + return; +} + +$getPosts = $db->prepare(' + SELECT + `post_id`, `post_text`, `post_created` + FROM `msz_forum_posts` + WHERE `topic_id` = :topic_id + AND `post_deleted` IS NULL +'); +$getPosts->bindValue('topic_id', $topic['topic_id']); +$posts = $getPosts->execute() ? $getPosts->fetchAll() : []; + +$lastParent = $topic['forum_id']; +$breadcrumbs = []; +$getBreadcrumb = $db->prepare(' + SELECT `forum_id`, `forum_name`, `forum_parent` + FROM `msz_forum_categories` + WHERE `forum_id` = :forum_id +'); + +while ($lastParent > 0) { + $getBreadcrumb->bindValue('forum_id', $lastParent); + $breadcrumb = $getBreadcrumb->execute() ? $getBreadcrumb->fetch() : []; + + if (!$breadcrumb) { + break; + } + + $breadcrumbs[$breadcrumb['forum_name']] = '/forum/forum.php?f=' . $breadcrumb['forum_id']; + $lastParent = $breadcrumb['forum_parent']; +} + +$breadcrumbs['Forums'] = '/forum/'; +$breadcrumbs = array_reverse($breadcrumbs); + +echo $templating->render('forum.topic', [ + 'topic_breadcrumbs' => $breadcrumbs, + 'topic_info' => $topic, + 'topic_posts' => $posts, +]); diff --git a/views/mio/forum/forum.twig b/views/mio/forum/forum.twig index e8827c72..b388f242 100644 --- a/views/mio/forum/forum.twig +++ b/views/mio/forum/forum.twig @@ -1,6 +1,6 @@ {% extends '@mio/forum/master.twig' %} -{% from '@mio/macros.twig' import navigation %} -{% from '@mio/forum/macros.twig' import forum_category_listing, forum_topic_listing %} +{% from '@mio/macros.twig' import navigation, paginate %} +{% from '@mio/forum/macros.twig' import forum_category_listing, forum_topic_listing, forum_category_buttons %} {% set title = forum_info.forum_name %} {% set canonical_url = '/forum/forum.php?f=' ~ forum_info.forum_id %} @@ -13,7 +13,14 @@ {% endif %} {% if forum_info.forum_type == 0 %} + {% set fcbuttons = forum_category_buttons(forum_info) %} + {% set fcpagination = paginate(forum_topics|length, 20, 0, canonical_url) %} + + {{ fcbuttons }} + {{ fcpagination }} {{ forum_topic_listing(forum_topics) }} + {{ fcpagination }} + {{ fcbuttons }} {% endif %} {{ navigation(mio_navigation, '/forum/') }} diff --git a/views/mio/forum/index.twig b/views/mio/forum/index.twig index 68b6ee83..d5951586 100644 --- a/views/mio/forum/index.twig +++ b/views/mio/forum/index.twig @@ -24,4 +24,3 @@ {{ navigation(mio_navigation, '/forum/') }} {% endblock %} - diff --git a/views/mio/forum/macros.twig b/views/mio/forum/macros.twig index ca387082..210cdf87 100644 --- a/views/mio/forum/macros.twig +++ b/views/mio/forum/macros.twig @@ -17,25 +17,33 @@ {% endmacro %} -{% macro forum_category_entry(forum, forum_icon) %} - {% set forum_icon = forum_icon|default(null) %} +{% macro forum_category_buttons(forum) %} +