Statamic: Prüfen, ob eine Navigation existiert
In manchen Projekten ist es gewünscht oder notwendig, dass bestimmte Navigationsbereiche optional bleiben. Besonders dann, wenn die Navigation vom Kunden gepflegt wird, kann es vorkommen, dass eine Navigation versehentlich gelöscht oder noch nicht eingerichtet wurde.
In solchen Fällen ist es wichtig, dass die Seite nicht mit einem Fehler 500 reagiert, sondern stattdessen sauber und stabil bleibt – auch ohne Navigation.
In diesem Beitrag zeige ich zwei Ansätze, wie Du in Statamic prüfen kannst, ob eine Navigation existiert, und diese Information sinnvoll im Template nutzt.

Szenario
Die Navigation ist optional und wird vom Kunden verwaltet.
Es soll verhindert werden, dass das Fehlen einer Navigation zu einem Fehler führt.
Ziel ist eine flexible, fehlertolerante Ausgabe im Frontend.
Variante 1: Eigenes Tag zur Prüfung der Navigation
Mit einem benutzerdefinierten Tag kannst Du gezielt prüfen, ob eine bestimmte Navigation vorhanden ist. Damit lässt sich die Ausgabe im Template gezielt steuern.
Beispiel: app/Tags/NavExists.php
<?php
namespace App\Tags;
use Statamic\Eloquent\Structures\NavModel;
use Statamic\Tags\Tags;
class NavExists extends Tags
{
/**
* Check if a navigation is configured.
*/
public function nav(): bool
{
return NavModel::query()
->where('handle', $this->params['handle'])
->get()
?->isNotEmpty() ?? false;
}
}
Verwendung im Template:
{{ if nav_exists:nav handle="header" }}
{{ /if }}
Vorteile:
Volle Kontrolle über die Darstellung.
Keine internen Änderungen am Standardverhalten notwendig.
Hinweis: Du musst in jedem Template selbst die Prüfung einbauen.
Variante 2: Standard-Tag nav
überschreiben
Alternativ kannst Du das bestehende nav
-Tag in Statamic überschreiben und die Prüfung direkt dort einbauen.
Wenn die gewünschte Navigation nicht existiert, wird einfach ein leerer Navigationsbaum zurückgegeben.
Beispiel: app/Tags/Nav.php
<?php
namespace App\Tags;
use Statamic\Eloquent\Structures\NavModel;
use Statamic\Tags\Nav as BaseNav;
class Nav extends BaseNav
{
public function index()
{
$handle = $this->params->get('handle', 'collection::pages');
$exists = NavModel::query()
->where('handle', $handle)
->get()
?->isNotEmpty() ?? false;
if (! $exists) {
return ['items' => []];
}
return $this->structure($handle);
}
}
Vorteil: Templates bleiben unverändert
Vorteile:
Kein zusätzlicher Aufwand in den Templates.
Bestehende Aufrufe des
nav
-Tags funktionieren wie gewohnt.Fehler durch fehlende Navigation werden automatisch abgefangen.