Nachdem Alexander vor einiger Zeit so freundlich war und euch gezeigt hat, wie man ziemlich einfach ein neues Modul für Icinga Web 2 einrichtet, setze ich genau an dieser Stelle an und erkläre, wieder auf der Basis des Hello World Moduls, die Einrichtung der Navigation.

Wir befinden uns also aktuell hier:
module-final

Untergeordnete Menü-Punkte

Angenommen wir möchten unseren Menü-Punkt auf der linken Seite in weitere Themen-Bereiche aufteilen, müssen wir uns mal wieder die configuration.php ansehen:

menuSection('Hello World', array(
    'url' => 'helloworld'
));

Für dieses Beispiel, werden wir ihn in zwei Einträge aufteilen:

menuSection('Hello', array(
    'icon'  => 'globe'
));
$section->add('World', array(
    'url'       => 'helloworld',
    'priority'  => 100
));
$section->add('Universe', array(
    'url'       => 'helloworld/universe',
    'priority'  => 101
));

Wer genau hinsieht, stellt fest, dass unser erster Menü-Punkt nun auf keine URL mehr verlinkt. Das führt dazu, dass er nur noch als Gruppierungs-Element dient und bei Interaktion, seine untergeordneten Einträge ausklappt. Dafür allerdings hat er nun ein schickes Icon spendiert bekommen. Außerdem wurde eine neue Eigenschaft hinzugefügt, mit der die Priorität (oder auch Reihenfolge) der Einträge beeinflusst werden kann. Diese sind übrigens standardmäßig alphabetisch sortiert.
Nun sieht das Menü folgendermaßen aus:
Menü-Unterpunkte

Tabs

Möchte man keinen Menü-Punkt einrichten, Menü-Unterpunkte noch weiter gruppieren oder hat schlicht und einfach keinen Platz mehr (soll schon vorgekommen sein..) kann man alternativ auch Tabs in seinen Sichten anzeigen. Der Einfachheit halber, oder auch weil mir gerade nichts besseres einfällt, werden wir nun die gerade hinzugefügten Menü-Unterpunkte erneut als Tabs in den beiden Sichten anzeigen. Hierfür sehen wir uns mal den IndexController an:

getTabs()->activate('world');
    }
    public function getTabs()
    {
        $tabs = parent::getTabs();
        $tabs->add(
            'world',
            array(
                'title' => 'World',
                'url'   => 'helloworld'
            )
        );
        $tabs->add(
            'universe',
            array(
                'title' => 'Universe',
                'url'   => 'helloworld/universe'
            )
        );
        return $tabs;
    }
}

Damit die Tabs allerdings auch angezeigt werden, müssen wir sie in der Sicht für die indexAction (index.phtml) ausgeben:

compact): ?>

Hello World

Betrachtet das neu hinzugefügte Konstrukt als Konvention. Niemand zwingt euch dazu es genau so zu machen, jedoch stellt ihr damit sicher, dass eure Sichten im Vollbild-Modus und Dashboard korrekt angezeigt werden.
Da allerdings der Menü-Punkt und Tab für das Universum gerade ins Leere führt.. müssen wir noch einen Controller für diese Route anlegen. Dazu erstellen wir eine neue Datei mit dem Namen UniverseController.php und das dazu gehörige view script:

getTabs()->activate('universe');
    }
    public function getTabs()
    {
        $tabs = parent::getTabs();
        $tabs->add(
            'world',
            array(
                'title' => 'World',
                'url'   => 'helloworld'
            )
        );
        $tabs->add(
            'universe',
            array(
                'title' => 'Universe',
                'url'   => 'helloworld/universe'
            )
        );
        return $tabs;
    }
}
compact): ?>

Hello Universe

Die Datei-Struktur sollte nun folgendermaßen aussehen:
helloworld-neue-dateien

Spalten

Wer zufällig schon einmal das Monitoring-Modul eingesetzt hat, wird bemerkt haben, dass manche Links nicht zu einer Änderung des kompletten Inhalts führen, sondern neue Inhalte rechts in einer zusätzlichen Spalte darstellen. Damit die neue Route, welche wir im folgenden definieren, nicht den kompletten Inhalt verändert, müssen wir das allerdings explizit ändern.
UniverseController.php

// *Snip*
    public function galaxyAction()
    {
        $galaxy = $this->params->getRequired('galaxy');
        $this->view->galaxy = $galaxy;
    }
    public function getTabs()
// *Snip*

views/scripts/universe/galaxy.phtml

compact): ?>
showOnlyCloseButton(); ?>

Hello

views/scripts/universe/index.phtml


  

Hello Universe

qlink('Greet the Milky Way', 'helloworld/universe/galaxy', array('galaxy' => 'Milky Way')); ?>
qlink('Greet Andromeda', 'helloworld/universe/galaxy', array('galaxy' => 'Andromeda')); ?>

Damit wir die Galaxien in einer neuen Spalte begrüßen, benötigen wir folgende Änderung am view script in dem sich die Links befinden:
views/scripts/universe/index.phtml


Dieses data- Attribut akzeptiert folgende Werte:

Wert Beschreibung
_main Benutze die erste Spalte und schließe alle anderen (Standard)
_self Benutze die aktuelle Spalte, andere bleiben unverändert
_next Benutze eine neue rechte Spalte und, falls nicht genug Platz ist, schließe die erste linke Spalte
<id> Benutze den Container mit der id <id>. Das kann entweder ein eigener HTML-Container sein oder eine der vordefinierten Spalten-Ids: col1, col2

Die Gültigkeit dieses Attributes ist nicht eingeschränkt und es lässt sich verschachteln. Konkret bedeutet das, es wird immer das für den Link meist relevanteste Attribut berücksichtigt. (Beispiel: <div data-base-target=”_next”><a data-base-target=”_self” …></a></div> _self besitzt eine höhere Relevanz als _next)
So, das war es auch schon wieder. Ich hoffe es ist informativ genug, falls es Fragen gibt, möchte ich darum bitten diese im Forum zu stellen. Danke und bis zum nächsten Mal!

Johannes Meyer
Johannes Meyer
Developer

Johannes ist seit 2011 bei uns und hilft bei der Entwicklung zukünftiger Knüller (Icinga2, Icinga Web 2, ...) aus dem Hause NETWAYS.