From 66ae74fe5b8e7a80ed8431b552867f7400260da3 Mon Sep 17 00:00:00 2001 From: uldisrudzitis Date: Thu, 8 Oct 2026 13:40:11 +0300 Subject: [PATCH] Render templates without warnings when a site has no sections The body and entries-list class builders read the current section's name unconditionally, so a site with no sections raised "Trying to access array offset on null" on every template. Add the section-name classes only when a current section exists. Co-Authored-By: Claude Opus 5.5 --- .../Sections/MessyTemplateRenderService.php | 16 ++++--- .../Sections/SectionTemplateRenderService.php | 20 +++++---- .../SectionTemplateRenderServiceTest.php | 44 +++++++++++++++++++ 3 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 _api_app/tests/Feature/SectionTemplateRenderServiceTest.php diff --git a/_api_app/app/Sites/Sections/MessyTemplateRenderService.php b/_api_app/app/Sites/Sections/MessyTemplateRenderService.php index 76b9cb26d..4aba9097d 100644 --- a/_api_app/app/Sites/Sections/MessyTemplateRenderService.php +++ b/_api_app/app/Sites/Sections/MessyTemplateRenderService.php @@ -198,10 +198,13 @@ public function getBodyClassList( $isAutoResponsive, $isEditMode ) { - $classes = [ - 'xContent-' . $currentSection['name'], - 'xSectionType-' . $currentSectionType, - ]; + $classes = []; + + if ($currentSection) { + $classes[] = 'xContent-' . $currentSection['name']; + } + + $classes[] = 'xSectionType-' . $currentSectionType; if (! empty($tagSlug)) { $classes[] = 'xSubmenu-' . $tagSlug; @@ -279,9 +282,12 @@ public function getPageEntriesClasses($currentSection, $tagSlug, $isResponsive) $classes = [ 'xEntriesList', 'clearfix', - 'xSection-' . $currentSection['name'], ]; + if ($currentSection) { + $classes[] = 'xSection-' . $currentSection['name']; + } + if (! empty($tagSlug)) { $classes[] = 'xTag-' . $tagSlug; } diff --git a/_api_app/app/Sites/Sections/SectionTemplateRenderService.php b/_api_app/app/Sites/Sections/SectionTemplateRenderService.php index b9f8c22e4..806de68dc 100644 --- a/_api_app/app/Sites/Sections/SectionTemplateRenderService.php +++ b/_api_app/app/Sites/Sections/SectionTemplateRenderService.php @@ -217,10 +217,13 @@ public function getBodyClasses($siteTemplateSettings, $sections, $sectionSlug, $ $currentSection = $this->getCurrentSection($sections, $sectionSlug); $currentSectionType = $this->getCurrentSectionType($currentSection); - $classes = [ - 'xContent-' . $currentSection['name'], - 'xSectionType-' . $currentSectionType, - ]; + $classes = []; + + if ($currentSection) { + $classes[] = 'xContent-' . $currentSection['name']; + } + + $classes[] = 'xSectionType-' . $currentSectionType; if (! empty($tagSlug)) { $classes[] = 'xSubmenu-' . $tagSlug; @@ -257,10 +260,11 @@ public function getPageEntriesAttributes($sections, $sectionSlug, $tagSlug) { $currentSection = $this->getCurrentSection($sections, $sectionSlug); $attributes = []; - $classes = [ - 'xEntriesList', - 'xSection-' . $currentSection['name'], - ]; + $classes = ['xEntriesList']; + + if ($currentSection) { + $classes[] = 'xSection-' . $currentSection['name']; + } if (! empty($tagSlug)) { $classes[] = 'xTag-' . $tagSlug; diff --git a/_api_app/tests/Feature/SectionTemplateRenderServiceTest.php b/_api_app/tests/Feature/SectionTemplateRenderServiceTest.php new file mode 100644 index 000000000..80aa7a4cb --- /dev/null +++ b/_api_app/tests/Feature/SectionTemplateRenderServiceTest.php @@ -0,0 +1,44 @@ + ['responsive' => 'no', 'centeredContents' => 'no']]; +} + +it('renders default template classes for a site without sections', function () { + $service = new DefaultTemplateRenderService; + + $bodyClasses = $service->getBodyClasses(sectionTemplateRenderSettings(), [], null, null, false); + $pageEntriesAttributes = $service->getPageEntriesAttributes([], null, null); + + expect($bodyClasses)->toBe('xSectionType-default') + ->and($pageEntriesAttributes)->toContain('xEntriesList') + ->and($pageEntriesAttributes)->not->toContain('xSection-'); +}); + +it('renders messy template classes for a site without sections', function () { + $service = new MessyTemplateRenderService; + + $bodyClasses = $service->getBodyClassList(sectionTemplateRenderSettings(), null, 'default', null, false, false, false); + $pageEntriesClasses = $service->getPageEntriesClasses(null, null, false); + + expect($bodyClasses)->toBe('xSectionType-default') + ->and($pageEntriesClasses)->toContain('xEntriesList') + ->and($pageEntriesClasses)->not->toContain('xSection-'); +}); + +it('renders the current section name in template classes', function () { + $sections = [['name' => 'about', '@attributes' => ['type' => 'default']]]; + $defaultService = new DefaultTemplateRenderService; + $messyService = new MessyTemplateRenderService; + + expect($defaultService->getBodyClasses(sectionTemplateRenderSettings(), $sections, 'about', null, false)) + ->toBe('xContent-about xSectionType-default') + ->and($defaultService->getPageEntriesAttributes($sections, 'about', null))->toContain('xSection-about') + ->and($messyService->getBodyClassList(sectionTemplateRenderSettings(), $sections[0], 'default', null, false, false, false)) + ->toBe('xContent-about xSectionType-default') + ->and($messyService->getPageEntriesClasses($sections[0], null, false))->toContain('xSection-about'); +});