From 7d0ae64978adabf57f785d988bc797d1cfde9c5c Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Feb 2026 10:13:49 +0000 Subject: [PATCH 1/5] Handle nav tag without handle param --- src/Http/Middleware/CacheTracker.php | 2 +- tests/Unit/NavTagTest.php | 73 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/NavTagTest.php diff --git a/src/Http/Middleware/CacheTracker.php b/src/Http/Middleware/CacheTracker.php index dd377e9..d5b9330 100644 --- a/src/Http/Middleware/CacheTracker.php +++ b/src/Http/Middleware/CacheTracker.php @@ -181,7 +181,7 @@ private function setupTagHooks() }); Tags\Nav::hook('init', function ($value, $next) use ($self) { - $handle = $this->params->get('handle') ? 'nav:'.$this->params->get('handle') : $this->tag; + $handle = 'nav:'.$this->params->get('handle', 'collection::pages'); $self->addContentTag($handle); return $next($value); diff --git a/tests/Unit/NavTagTest.php b/tests/Unit/NavTagTest.php new file mode 100644 index 0000000..4b78727 --- /dev/null +++ b/tests/Unit/NavTagTest.php @@ -0,0 +1,73 @@ +title('Footer') + ->expectsRoot(true) + ->collections(['pages']) + ->save(); + + $view = <<<'BLADE' +{{ nav handle="footer" }} + {{ title }} +{{ /nav }} +BLADE; + + file_put_contents($this->viewPath('nav-test.antlers.html'), $view); + + Facades\Entry::make() + ->id('nav-test-page') + ->slug('nav-test') + ->collection('pages') + ->data(['template' => 'nav-test']) + ->save(); + + $this->get('/nav-test'); + + $tags = collect(Tracker::all())->first()['tags'] ?? []; + + $this->assertContains('nav:footer', $tags); + } + + #[Test] + public function it_tracks_nav_tag_without_handle_using_default() + { + $view = <<<'BLADE' +{{ nav }} + {{ title }} +{{ /nav }} +BLADE; + + file_put_contents($this->viewPath('nav-default.antlers.html'), $view); + + Facades\Entry::make() + ->id('nav-default-page') + ->slug('nav-default') + ->collection('pages') + ->data(['template' => 'nav-default']) + ->save(); + + $this->get('/nav-default'); + + $tags = collect(Tracker::all())->first()['tags'] ?? []; + + $this->assertContains('nav:collection::pages', $tags); + } + + protected function viewPath($name) + { + return __DIR__.'/../__fixtures__/resources/views/'.$name; + } +} From b94ad3ca2f9ea3c7004374bed6b067dbf1ec0773 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Feb 2026 10:19:16 +0000 Subject: [PATCH 2/5] Add test for shorthand --- src/Http/Middleware/CacheTracker.php | 2 +- tests/Unit/NavTagTest.php | 32 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Http/Middleware/CacheTracker.php b/src/Http/Middleware/CacheTracker.php index d5b9330..6b4dd78 100644 --- a/src/Http/Middleware/CacheTracker.php +++ b/src/Http/Middleware/CacheTracker.php @@ -181,7 +181,7 @@ private function setupTagHooks() }); Tags\Nav::hook('init', function ($value, $next) use ($self) { - $handle = 'nav:'.$this->params->get('handle', 'collection::pages'); + $handle = 'nav:'.$this->params->get('handle', Str::after($this->tag, 'nav:')); $self->addContentTag($handle); return $next($value); diff --git a/tests/Unit/NavTagTest.php b/tests/Unit/NavTagTest.php index 4b78727..2b44a49 100644 --- a/tests/Unit/NavTagTest.php +++ b/tests/Unit/NavTagTest.php @@ -41,6 +41,38 @@ public function it_tracks_nav_tag_with_explicit_handle() $this->assertContains('nav:footer', $tags); } + #[Test] + public function it_tracks_nav_tag_with_shorthand_handle() + { + // Create a navigation structure + Facades\Nav::make('footer') + ->title('Footer') + ->expectsRoot(true) + ->collections(['pages']) + ->save(); + + $view = <<<'BLADE' +{{ nav:footer }} + {{ title }} +{{ /nav:footer }} +BLADE; + + file_put_contents($this->viewPath('nav-test.antlers.html'), $view); + + Facades\Entry::make() + ->id('nav-test-page') + ->slug('nav-test') + ->collection('pages') + ->data(['template' => 'nav-test']) + ->save(); + + $this->get('/nav-test'); + + $tags = collect(Tracker::all())->first()['tags'] ?? []; + + $this->assertContains('nav:footer', $tags); + } + #[Test] public function it_tracks_nav_tag_without_handle_using_default() { From fffbb3e894fec2022d6ca9d90997a94e6097436b Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Feb 2026 10:25:24 +0000 Subject: [PATCH 3/5] update logic --- src/Http/Middleware/CacheTracker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Middleware/CacheTracker.php b/src/Http/Middleware/CacheTracker.php index 6b4dd78..948d4f9 100644 --- a/src/Http/Middleware/CacheTracker.php +++ b/src/Http/Middleware/CacheTracker.php @@ -181,7 +181,7 @@ private function setupTagHooks() }); Tags\Nav::hook('init', function ($value, $next) use ($self) { - $handle = 'nav:'.$this->params->get('handle', Str::after($this->tag, 'nav:')); + $handle = 'nav:'.$this->params->get('handle', $this->tag != 'nav:index' ? Str::after($this->tag, 'nav:') : 'collection::pages'); $self->addContentTag($handle); return $next($value); From 91e98ed80ca39361d5f719479e779cba9ea27088 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Feb 2026 11:22:21 +0000 Subject: [PATCH 4/5] support handles by reference --- src/Http/Middleware/CacheTracker.php | 9 ++++++- tests/Unit/NavTagTest.php | 35 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/Http/Middleware/CacheTracker.php b/src/Http/Middleware/CacheTracker.php index 948d4f9..b1a0cdf 100644 --- a/src/Http/Middleware/CacheTracker.php +++ b/src/Http/Middleware/CacheTracker.php @@ -13,6 +13,7 @@ use Statamic\Facades\URL; use Statamic\Forms; use Statamic\StaticCaching\Cacher; +use Statamic\Structures\Nav; use Statamic\Structures\Page; use Statamic\Support\Str; use Statamic\Tags; @@ -181,7 +182,13 @@ private function setupTagHooks() }); Tags\Nav::hook('init', function ($value, $next) use ($self) { - $handle = 'nav:'.$this->params->get('handle', $this->tag != 'nav:index' ? Str::after($this->tag, 'nav:') : 'collection::pages'); + $handle = $this->params->get('handle', $this->tag != 'nav:index' ? Str::after($this->tag, 'nav:') : 'collection::pages'); + + if ($handle instanceof Nav) { + $handle = $handle->handle(); + } + + $handle = 'nav:'.$handle; $self->addContentTag($handle); return $next($value); diff --git a/tests/Unit/NavTagTest.php b/tests/Unit/NavTagTest.php index 2b44a49..4271d47 100644 --- a/tests/Unit/NavTagTest.php +++ b/tests/Unit/NavTagTest.php @@ -98,6 +98,41 @@ public function it_tracks_nav_tag_without_handle_using_default() $this->assertContains('nav:collection::pages', $tags); } + #[Test] + public function it_tracks_nav_tag_when_handle_is_nav_instance() + { + // Create a navigation structure + $nav = Facades\Nav::make('sidebar') + ->title('Sidebar') + ->expectsRoot(true) + ->collections(['pages']) + ->save(); + + $view = <<<'BLADE' +{{ nav :handle="nav" }} + {{ title }} +{{ /nav }} +BLADE; + + file_put_contents($this->viewPath('nav-test.antlers.html'), $view); + + Facades\Entry::make() + ->id('nav-test-page') + ->slug('nav-test') + ->collection('pages') + ->data([ + 'template' => 'nav-test', + 'nav' => $nav, + ]) + ->save(); + + $this->get('/nav-test'); + + $tags = collect(Tracker::all())->first()['tags'] ?? []; + + $this->assertContains('nav:sidebar', $tags); + } + protected function viewPath($name) { return __DIR__.'/../__fixtures__/resources/views/'.$name; From 65aec346e29783206828a3f681cfa1448526c88f Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Feb 2026 11:27:35 +0000 Subject: [PATCH 5/5] fix failing test --- tests/Unit/NavTagTest.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/Unit/NavTagTest.php b/tests/Unit/NavTagTest.php index 4271d47..51e09c9 100644 --- a/tests/Unit/NavTagTest.php +++ b/tests/Unit/NavTagTest.php @@ -102,27 +102,29 @@ public function it_tracks_nav_tag_without_handle_using_default() public function it_tracks_nav_tag_when_handle_is_nav_instance() { // Create a navigation structure - $nav = Facades\Nav::make('sidebar') + $nav = tap(Facades\Nav::make('sidebar') ->title('Sidebar') ->expectsRoot(true) - ->collections(['pages']) + ->collections(['pages'])) ->save(); + // The template uses a blueprint field that returns a Nav instance $view = <<<'BLADE' -{{ nav :handle="nav" }} +{{ nav :handle="my_nav" }} {{ title }} {{ /nav }} BLADE; file_put_contents($this->viewPath('nav-test.antlers.html'), $view); + // Create entry with nav field that returns Nav instance Facades\Entry::make() ->id('nav-test-page') ->slug('nav-test') ->collection('pages') ->data([ 'template' => 'nav-test', - 'nav' => $nav, + 'my_nav' => $nav, ]) ->save();