From bc85fa1644d3a752531866af5a311f13cff483f5 Mon Sep 17 00:00:00 2001 From: Alexander Andreev Date: Sat, 21 Feb 2026 13:18:41 +0300 Subject: [PATCH] Public: improve mobile nav and hide empty nav items Hide sections and topics with zero photos on public sidebar while keeping both menus expanded by default. Update mobile navigation so menu toggle lives in bottom bars, add contextual page headings for catalog/photo views, and ensure sidebar drawer toggles correctly from catalog and detail screens. --- index.php | 122 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 28 deletions(-) diff --git a/index.php b/index.php index d289549..f762b36 100644 --- a/index.php +++ b/index.php @@ -46,6 +46,14 @@ $activePhotoId = (int)($_GET['photo_id'] ?? 0); $activeTopicId = (int)($_GET['topic_id'] ?? 0); $welcomeText = settingGet('welcome_text', 'Добро пожаловать в галерею. Выберите раздел слева, чтобы посмотреть фотографии.'); +$hasVisibleSections = false; +foreach ($sections as $s) { + if ((int)($s['photos_count'] ?? 0) > 0) { + $hasVisibleSections = true; + break; + } +} + $photo = $activePhotoId > 0 ? photoById($activePhotoId) : null; if ($photo && $activeSectionId < 1) { $activeSectionId = (int)$photo['section_id']; @@ -56,6 +64,7 @@ $comments = $photo ? commentsByPhoto($activePhotoId) : []; $topics = []; $topicCounts = []; $topicTree = []; +$hasVisibleTopics = false; try { $topics = topicsAllForSelect(); if ($activeTopicId > 0) { @@ -66,12 +75,19 @@ try { } $topicCounts = topicPhotoCounts(null); $topicTree = buildTopicTreePublic($topics); + foreach ($topics as $topicItem) { + if ((int)($topicCounts[(int)$topicItem['id']] ?? 0) > 0) { + $hasVisibleTopics = true; + break; + } + } } catch (Throwable) { $topics = []; $topicCounts = []; $topicTree = []; $activeTopicId = 0; $filterMode = $activeSectionId > 0 ? 'section' : 'none'; + $hasVisibleTopics = false; } $photos = ($activeSectionId > 0 || $activeTopicId > 0) @@ -88,9 +104,11 @@ foreach ($sections as $s) { } $activeTopicName = ''; +$activeTopicShortName = ''; foreach ($topics as $t) { if ((int)$t['id'] === $activeTopicId) { $activeTopicName = (string)$t['full_name']; + $activeTopicShortName = (string)$t['name']; break; } } @@ -146,8 +164,9 @@ if ($photo) { } $hasMobilePhotoNav = $activePhotoId > 0 && $photo && $detailTotal > 0; +$hasMobileCatalogNav = !$photo && ($isTopicMode || $isSectionMode); $bodyClasses = [$isHomePage ? 'is-home' : 'is-inner']; -if ($hasMobilePhotoNav) { +if ($hasMobilePhotoNav || $hasMobileCatalogNav) { $bodyClasses[] = 'has-mobile-nav'; } @@ -158,6 +177,22 @@ if ($activeTopicId > 0 && $activeTopicName !== '') { $detailLocationLabel = 'в разделе «' . $sectionNames[$detailSectionId] . '»'; } +$pageHeading = ''; +if ($isTopicMode && $activeTopicShortName !== '') { + $pageHeading = $activeTopicShortName; +} elseif ($isSectionMode && isset($sectionNames[$activeSectionId])) { + $pageHeading = $sectionNames[$activeSectionId]; +} elseif ($photo && isset($sectionNames[$detailSectionId])) { + $pageHeading = $sectionNames[$detailSectionId]; +} + +$catalogLocationLabel = ''; +if ($isTopicMode && $activeTopicName !== '') { + $catalogLocationLabel = 'Тема: ' . $activeTopicName; +} elseif ($isSectionMode && isset($sectionNames[$activeSectionId])) { + $catalogLocationLabel = 'Раздел: ' . $sectionNames[$activeSectionId]; +} + function h(string $v): string { return htmlspecialchars($v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function assetUrl(string $path): string { $f=__DIR__ . '/' . ltrim($path,'/'); $v=is_file($f)?(string)filemtime($f):(string)time(); return $path . '?v=' . rawurlencode($v); } function limitText(string $text, int $len): string { return function_exists('mb_substr') ? mb_substr($text, 0, $len) : substr($text, 0, $len); } @@ -291,6 +326,8 @@ function outputWatermarked(string $path, string $mime): never