Privatsphären-Einstellungen

Auf unserer Website verwenden wir verschiedene Arten von Cookies: technische, funktionale und Analyse-Cookies. Grundsätzlich können Sie unsere Seite auch ohne Cookies besuchen. Wenn Sie auf "Akzeptieren" klicken, stimmen Sie der Nutzung dieser Technologien zu. Details

Zum Inhalt springen

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.

Statamic: Check if a navigation exists.

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.