From 09e003f88a54b7d9d5c5aacbcb0cf4a31af4b001 Mon Sep 17 00:00:00 2001 From: spleenftw Date: Fri, 29 May 2026 16:16:12 +0200 Subject: [PATCH] update sidebar & themes --- index.php | 56 ++++++++++++++++++++++++++++++++++++++++--------- php/head.php | 8 +++++-- php/sidebar.php | 11 +++++----- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/index.php b/index.php index 83e4ab7..e300591 100644 --- a/index.php +++ b/index.php @@ -17,23 +17,59 @@ // (Popeye-style) while keeping the other plugins in the right sidebar. // Mirrors Bludit's own Theme::plugins() loop, but captures the output. global $plugins; - $sidebarSearchHtml = ''; - $sidebarOtherHtml = ''; + $sidebarSearchHtml = ''; // search box, rendered under the hero on the homepage + $sidebarItems = array(); // every sidebar plugin, to be sorted into a fixed order + $sidebarIndex = 0; if (isset($plugins['siteSidebar'])) { foreach ($plugins['siteSidebar'] as $plugin) { $out = $plugin->siteSidebar(); - if (strpos($out, 'plugin-search') !== false) { + + $isSearch = (strpos($out, 'plugin-search') !== false); + $isNav = (strpos($out, 'plugin-navigation') !== false || strpos($out, 'plugin-pages') !== false); + + // Fixed sidebar order (lower = higher up). Unknown plugins such as + // the Hit Counter default to 90, i.e. pinned to the bottom. + $priority = 90; + if (strpos($out, 'plugin-about') !== false) $priority = 10; // Blog / About + elseif ($isSearch) $priority = 20; // Search + elseif ($isNav) $priority = 30; // Navigation + elseif (strpos($out, 'plugin-categories') !== false) $priority = 40; // Category + + if ($isSearch) { $sidebarSearchHtml .= $out; - } else { - // Mark the navigation / pages plugin so its list can be - // shuffled client-side (see the script near the body end). - if (strpos($out, 'plugin-navigation') !== false || strpos($out, 'plugin-pages') !== false) { - $out = '
' . $out . '
'; - } - $sidebarOtherHtml .= $out; } + // Mark the navigation / pages plugin so its list can be shuffled + // client-side (see the script near the body end). + if ($isNav) { + $out = '
' . $out . '
'; + } + + $sidebarItems[] = array( + 'priority' => $priority, + 'index' => $sidebarIndex++, + 'search' => $isSearch, + 'html' => $out, + ); } } + + // Stable sort by priority, then original order (PHP < 8 usort isn't stable). + usort($sidebarItems, function ($a, $b) { + if ($a['priority'] === $b['priority']) { + return $a['index'] - $b['index']; + } + return $a['priority'] - $b['priority']; + }); + + $sidebarFullHtml = ''; // all plugins, ordered (used off the homepage) + $sidebarNoSearchHtml = ''; // same, minus search (used on the homepage) + foreach ($sidebarItems as $item) { + $sidebarFullHtml .= $item['html']; + if (!$item['search']) { + $sidebarNoSearchHtml .= $item['html']; + } + } + // The hero (and the relocated search) only appear on the blog front page. $heroVisible = ($WHERE_AM_I === 'home' && Paginator::currentPage() == 1); ?> diff --git a/php/head.php b/php/head.php index dcd338c..3034208 100644 --- a/php/head.php +++ b/php/head.php @@ -36,8 +36,12 @@ - - + + + diff --git a/php/sidebar.php b/php/sidebar.php index b14bd46..827cf10 100644 --- a/php/sidebar.php +++ b/php/sidebar.php @@ -18,13 +18,14 @@ Search > Navigation > Category > … > Hit Counter (bottom) + // On the homepage front page the search box is shown under the hero, so + // it is omitted from the sidebar there. if ($heroVisible) { - echo $sidebarOtherHtml; + echo $sidebarNoSearchHtml; } else { - echo $sidebarSearchHtml . $sidebarOtherHtml; + echo $sidebarFullHtml; } ?>