From 8778bda97f982333eab3445460995a9444be19fe Mon Sep 17 00:00:00 2001 From: partydragen Date: Thu, 4 Jun 2026 18:13:51 +0200 Subject: [PATCH] Dynamic page loading --- index.php | 63 +++++++++++++----------- modules/Core/module.php | 5 +- modules/Core/pages/panel/user.php | 10 +--- modules/Core/pages/profile.php | 9 ++-- modules/Forum/module.php | 4 +- modules/Forum/pages/forum/view_forum.php | 11 +---- modules/Forum/pages/forum/view_topic.php | 11 +---- 7 files changed, 50 insertions(+), 63 deletions(-) diff --git a/index.php b/index.php index 30d956909d..948cf36709 100644 --- a/index.php +++ b/index.php @@ -109,41 +109,48 @@ $all_pages = $pages->returnPages(); -if (array_key_exists($route, $all_pages)) { - $pages->setActivePage($all_pages[$route]); - if (isset($all_pages[$route]['custom'])) { - require(implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'modules', 'Core', 'pages', 'custom.php'])); - die; - } - - $path = implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'modules', $all_pages[$route]['module'], $all_pages[$route]['file']]); +foreach ($all_pages as $page_route => $page) { + $regex = preg_replace( + '/\{([a-zA-Z0-9_]+)\}/', + '(?P<$1>[^/]+)', + $page_route + ); - if (file_exists($path)) { - require($path); - die; - } -} else { - // Use recursion to check - might have URL parameters in path - $path_array = explode('/', $route); + $regex = '#^' . rtrim($regex, '/') . '$#'; - for ($i = count($path_array) - 2; $i > 0; $i--) { - $new_path = '/'; - for ($n = 1; $n <= $i; $n++) { - $new_path .= $path_array[$n] . '/'; + if (preg_match($regex, $route, $matches)) { + $route_params = []; + foreach ($matches as $key => $value) { + if (!is_int($key)) { + $route_params[$key] = $value; + } } - $new_path = rtrim($new_path, '/'); + $pages->setActivePage($page); + + if (isset($page['custom'])) { + require implode(DIRECTORY_SEPARATOR, [ + ROOT_PATH, + 'modules', + 'Core', + 'pages', + 'custom.php' + ]); + die; + } - if (array_key_exists($new_path, $all_pages)) { - $path = implode(DIRECTORY_SEPARATOR, [ROOT_PATH, 'modules', $all_pages[$new_path]['module'], $all_pages[$new_path]['file']]); + $path = implode(DIRECTORY_SEPARATOR, [ + ROOT_PATH, + 'modules', + $page['module'], + $page['file'] + ]); - if (file_exists($path)) { - $pages->setActivePage($all_pages[$new_path]); - require($path); - die; - } + if (file_exists($path)) { + require $path; + die; } } } -require(ROOT_PATH . '/404.php'); +require(ROOT_PATH . '/404.php'); \ No newline at end of file diff --git a/modules/Core/module.php b/modules/Core/module.php index 8e13cdf249..802c91583f 100644 --- a/modules/Core/module.php +++ b/modules/Core/module.php @@ -31,7 +31,8 @@ public function __construct(Language $language, Pages $pages, User $user, Naviga $pages->add('Core', '/login', 'pages/login.php'); $pages->add('Core', '/logout', 'pages/logout.php'); - $pages->add('Core', '/profile', 'pages/profile.php', 'profile', true); + $pages->add('Core', '/profile', 'pages/profile.php'); + $pages->add('Core', '/profile/{username}', 'pages/profile.php', 'profile', true); $pages->add('Core', '/register', 'pages/register.php'); $pages->add('Core', '/register/oauth', 'pages/register.php'); $pages->add('Core', '/validate', 'pages/validate.php'); @@ -116,7 +117,7 @@ public function __construct(Language $language, Pages $pages, User $user, Naviga $pages->add('Core', '/panel/users/punishments', 'pages/panel/users_punishments.php'); $pages->add('Core', '/panel/users/reports', 'pages/panel/users_reports.php'); $pages->add('Core', '/panel/users/sessions', 'pages/panel/users_sessions.php'); - $pages->add('Core', '/panel/user', 'pages/panel/user.php'); + $pages->add('Core', '/panel/user/{user}', 'pages/panel/user.php'); // Ajax GET requests $pages->addAjaxScript(URL::build('/queries/servers')); diff --git a/modules/Core/pages/panel/user.php b/modules/Core/pages/panel/user.php index 242c9d9db0..99190b358e 100644 --- a/modules/Core/pages/panel/user.php +++ b/modules/Core/pages/panel/user.php @@ -14,6 +14,7 @@ * @var Navigation $staffcp_nav * @var Pages $pages * @var string $route + * @var array $route_params * @var TemplateBase $template * @var User $user * @var Widgets $widgets @@ -24,14 +25,7 @@ die(); } -$uid = explode('/', $route); -$uid = $uid[count($uid) - 1]; - -if (!strlen($uid)) { - Redirect::to(URL::build('/panel')); -} - -$uid = explode('-', $uid); +$uid = explode('-', $route_params['user']); if (!is_numeric($uid[0])) { Redirect::to(URL::build('/panel')); } diff --git a/modules/Core/pages/profile.php b/modules/Core/pages/profile.php index 8d0c5b044b..2a27887086 100644 --- a/modules/Core/pages/profile.php +++ b/modules/Core/pages/profile.php @@ -23,10 +23,9 @@ $timeago = new TimeAgo(TIMEZONE); -$profile = explode('/', rtrim($_GET['route'], '/')); -if (count($profile) >= 3 && ($profile[count($profile) - 1] != 'profile' || $profile[count($profile) - 2] == 'profile') && !isset($_GET['error'])) { +if (isset($route_params['username'])) { // User specified - $md_profile = $profile[count($profile) - 1]; + $md_profile = $route_params['username']; $page_metadata = DB::getInstance()->get('page_descriptions', ['page', '/profile'])->results(); if (count($page_metadata)) { @@ -54,9 +53,9 @@ } '); -if (count($profile) >= 3 && ($profile[count($profile) - 1] != 'profile' || $profile[count($profile) - 2] == 'profile') && !isset($_GET['error'])) { +if (isset($route_params['username'])) { // User specified - $profile = $profile[count($profile) - 1]; + $profile = $route_params['username']; $profile_user = new User($profile, 'username'); if (!$profile_user->exists()) { diff --git a/modules/Forum/module.php b/modules/Forum/module.php index 05a159638e..4afcc21a57 100644 --- a/modules/Forum/module.php +++ b/modules/Forum/module.php @@ -30,8 +30,8 @@ public function __construct(Language $language, Language $forum_language, Pages $pages->add('Forum', '/forum', 'pages/forum/index.php', 'forum', true); $pages->add('Forum', '/forum/error', 'pages/forum/error.php'); - $pages->add('Forum', '/forum/view', 'pages/forum/view_forum.php'); - $pages->add('Forum', '/forum/topic', 'pages/forum/view_topic.php'); + $pages->add('Forum', '/forum/view/{forum}', 'pages/forum/view_forum.php'); + $pages->add('Forum', '/forum/topic/{topic}', 'pages/forum/view_topic.php'); $pages->add('Forum', '/forum/new', 'pages/forum/new_topic.php'); $pages->add('Forum', '/forum/spam', 'pages/forum/spam.php'); $pages->add('Forum', '/forum/report', 'pages/forum/report.php'); diff --git a/modules/Forum/pages/forum/view_forum.php b/modules/Forum/pages/forum/view_forum.php index e548d02e06..54fc4d45f8 100644 --- a/modules/Forum/pages/forum/view_forum.php +++ b/modules/Forum/pages/forum/view_forum.php @@ -15,6 +15,7 @@ * @var Navigation $staffcp_nav * @var Pages $pages * @var string $route + * @var array $route_params * @var TemplateBase $template * @var User $user * @var Widgets $widgets @@ -27,15 +28,7 @@ $timeago = new TimeAgo(TIMEZONE); // Get forum ID -$fid = explode('/', $route); -$fid = $fid[count($fid) - 1]; - -if (!strlen($fid)) { - require_once(ROOT_PATH . '/404.php'); - die(); -} - -$fid = explode('-', $fid); +$fid = explode('-', $route_params['forum']); if (!is_numeric($fid[0])) { require_once(ROOT_PATH . '/404.php'); die(); diff --git a/modules/Forum/pages/forum/view_topic.php b/modules/Forum/pages/forum/view_topic.php index 144bff4f65..81f3080aec 100644 --- a/modules/Forum/pages/forum/view_topic.php +++ b/modules/Forum/pages/forum/view_topic.php @@ -15,6 +15,7 @@ * @var Navigation $staffcp_nav * @var Pages $pages * @var string $route + * @var array $route_params * @var TemplateBase $template * @var User $user * @var Widgets $widgets @@ -27,15 +28,7 @@ $timeago = new TimeAgo(TIMEZONE); // Get topic ID -$tid = explode('/', $route); -$tid = $tid[count($tid) - 1]; - -if (!strlen($tid)) { - require_once ROOT_PATH . '/404.php'; - die(); -} - -$tid = explode('-', $tid); +$tid = explode('-', $route_params['topic']); if (!is_numeric($tid[0])) { require_once ROOT_PATH . '/404.php'; die();