diff --git a/public/search.php b/public/search.php
new file mode 100644
index 00000000..0feefe54
--- /dev/null
+++ b/public/search.php
@@ -0,0 +1,53 @@
+bindValue('query', $searchQuery);
+ $forumTopics = db_fetch_all($findForumTopics);
+
+ $findForumPosts = db_prepare('
+ SELECT fp.`post_id`, fp.`post_text`, ft.`topic_title`, u.`username`
+ FROM `msz_forum_posts` AS fp
+ LEFT JOIN `msz_forum_topics` AS ft
+ ON ft.`topic_id` = fp.`topic_id`
+ LEFT JOIN `msz_users` AS u
+ ON u.`user_id` = fp.`user_id`
+ WHERE MATCH(fp.`post_text`)
+ AGAINST (:query IN NATURAL LANGUAGE MODE);
+ ');
+ $findForumPosts->bindValue('query', $searchQuery);
+ $forumPosts = db_fetch_all($findForumPosts);
+
+ $findUsers = db_prepare('
+ SELECT `user_id`, `username`
+ FROM `msz_users`
+ WHERE LOWER(`username`) LIKE CONCAT("%", LOWER(:query), "%");
+ ');
+ $findUsers->bindValue('query', $searchQuery);
+ $users = db_fetch_all($findUsers);
+
+ $findNewsPosts = db_prepare('
+ SELECT `post_id`, `post_title`, `post_text`
+ FROM `msz_news_posts`
+ WHERE MATCH(`post_title`, `post_text`)
+ AGAINST (:query IN NATURAL LANGUAGE MODE);
+ ');
+ $findNewsPosts->bindValue('query', $searchQuery);
+ $newsPosts = db_fetch_all($findNewsPosts);
+}
+
+echo tpl_render('home.search', [
+ 'search_query' => $searchQuery,
+ 'forum_topics' => $forumTopics ?? [],
+ 'forum_posts' => $forumPosts ?? [],
+ 'users' => $users ?? [],
+ 'news_posts' => $newsPosts ?? [],
+]);
diff --git a/src/url.php b/src/url.php
index b7482de2..63fbf6c0 100644
--- a/src/url.php
+++ b/src/url.php
@@ -12,6 +12,9 @@ define('MSZ_URLS', [
'info' => ['/info.php/
'],
'media-proxy' => ['/proxy.php//'],
+ 'search-index' => ['/search.php'],
+ 'search-query' => ['/search.php', ['q' => '', 't' => '']],
+
'auth-login' => ['/auth/login.php', ['username' => '', 'redirect' => '']],
'auth-login-welcome' => ['/auth/login.php', ['welcome' => '1', 'username' => '']],
'auth-register' => ['/auth/register.php'],
diff --git a/templates/_layout/header.twig b/templates/_layout/header.twig
index 72d7d46d..08dabd26 100644
--- a/templates/_layout/header.twig
+++ b/templates/_layout/header.twig
@@ -54,6 +54,12 @@
'url': url('settings-index'),
'icon': 'fas fa-cog fa-fw',
},
+ {
+ 'title': 'Search',
+ 'url': url('search-index'),
+ 'icon': 'fas fa-search fa-fw',
+ 'display': current_user.general_perms|default(0)|perms_check(constant('MSZ_PERM_GENERAL_TESTER'))
+ },
{
'title': 'Return to Site',
'url': site_link|default(url('index')),
diff --git a/templates/home/search.twig b/templates/home/search.twig
new file mode 100644
index 00000000..27289651
--- /dev/null
+++ b/templates/home/search.twig
@@ -0,0 +1,59 @@
+{% extends 'home/master.twig' %}
+{% from 'macros.twig' import container_title %}
+{% from '_layout/input.twig' import input_text %}
+
+{% set canonical_url = url('search-query', {'query': search_query}) %}
+
+{% block content %}
+
+
+ {% if search_query|length > 0 %}
+
+ {{ container_title('Topics (%s)'|format(forum_topics|length|number_format)) }}
+ {% for topic in forum_topics %}
+
+ {{ topic.topic_title }}
+
+ {% endfor %}
+
+
+
+ {{ container_title('Posts (%s)'|format(forum_posts|length|number_format)) }}
+
+ {% for post in forum_posts %}
+
+ Reply by {{ post.username }} in "{{ post.topic_title }}"
+
+ {% endfor %}
+
+
+
+ {{ container_title('Users (%s)'|format(users|length|number_format)) }}
+ {% for user in users %}
+
+ {{ user.username }}
+
+ {% endfor %}
+
+
+
+ {{ container_title('News (%s)'|format(news_posts|length|number_format)) }}
+ {% for post in news_posts %}
+
+ {{ post.post_title }}
+
+ {% endfor %}
+
+ {% endif %}
+{% endblock %}
+