Navigation in OpenSAGA 3.0

Die Portal-Navigation gehört seit den Anfängen von OpenSAGA zu den Standard-Modellen. Optisch vielfältig anpassbar, war die Navigation zur Laufzeit allerdings relativ statisch in ihrer Form. In OpenSAGA 3.0 haben wir nun auch den Bereich der Navigation ein wenig überholt und dynamisiert.

Die Grundlage der Navigation sind und bleiben die zusammengeführten Navigations-Modelle aller Erweiterungen. Diese Modelle bilden nun den Basis-Stand, den Auslieferungszustand, der per Benutzeroberfläche editiert werden kann — auch und vor allem punktuell, während diese Änderungen jederzeit automatisch mit Änderungen der Basis-Modelle zusammengeführt werden können.

Es ist auch möglich, Änderungen an der Navigation per Manipulation der zu Grunde liegenden Domänen-Objekte zu ändern.

Content-Mappings als Navigations-Ziel

Neben Start-Zuständen und externen URLs kann nun auch eine dritte Ziel-Art von einem Navigationseintrag aus angesprungen werden, nämlich die Content-Mappings, die ja wie bereits erwähnt als logische Link-Ziele fungieren.

Parallel zu der Parametrisierung von Start-Zustandseinsprüngen kann dabei die Navigation ein Input-Value-Set definieren, das Eigenschaftswerte und Fachobjekt-Referenzen an das Content-Mapping / den eigenständingen View übergibt.

Neu: Graphische Navigation

Wir haben einige deklarative Neuerungen in der Navigation eingeführt. Zum Beispiel ist es jetzt möglich eine Graphik anstelle eines Labels zu definieren.

<image-item
    id="cms-test.n_applications.qs-nav" 
    resource="media/qs.png" 
    external-target="http://www.quinscape.de"
    title="Link to Quinscape website" />

Hier wird die OpenSAGA-Ressource “media/qs.png” als Navigationsgraphik eingebunden und mit einem Titel versehen.

Neu: Navigations-Domänen-Listen

Wie bereits erwähnt, wurde die Navigation in OpenSAGA 3.0 dynamisiert und kann nun per Benutzeroberfläche oder Manipulation der zu Grunde liegenden Domänen-Objekte angepasst werden. So können generelle, auch strukturelle Änderungen vorgenommen werden.

Daneben gibt es auch die Möglichkeit, dynamische Unterpunkte innerhalb einer Navigation zu definieren. Dies kann mit dem neuen <navigation-domain-list /> Element erreicht werden.

<item id="myext.n_applications.cms-nav" label="Contents">
    <item-list>
        <navigation-domain-list 
            id="myext.n_applications.cms-nav2"
            domain-type-ref="myext.d_content" 
            label-property-ref="myext.d_content.title"
            content-mapping-ref="myext.cm_content">
            <input-value-set>
                <input-value 
                    name="object" 
                    source-scoped-domain-object-ref="current-domain-object"/>
            </input-value-set>
            <sort-order-list>
                <sort-order property-ref="myext.d_content.title"/>
            </sort-order-list>
            <filter-specification>
                <equals>
                    <property property-ref="myext.d_content.draft"/>
                    <constant value="false"/>
                </equals>
            </filter-specification>
        </navigation-domain-list>
    </item-list>
</item>

Hier sehen wir die Definition einer Navigation-Domain-List. Unterhalb eines Oberknotens mit dem Label “Contents” wird eine dynamische Liste von Navigationseinträgen deklariert.

Alle dynamischen Navigationseinträge beziehen sich auf denselben Domänen-Typen. Eine gefilterte Liste wird so definiert, dass sie nur Objekte enthält, die sich nicht im Entwurfsmodus befinden.

Die Objeke der Liste werden nacheinander, jeweils als eigener parametrisierter Navigations-Link ausgegeben. Die Objekt-Identität des aktuellen Objekts wird dabei als Parameter “object” and das Content-Mapping “myext.cm_content” weitergegeben.

@CustomNavigation

Um eine möglichst große Freiheit bei der Gestaltung von Navigationen zu erreichen, haben wir auch eine weitere, Custom-Logic basierte Darstellung der Navigation realisiert.Die bereits erwähnten graphischen Navigationseinträge und die Navigations-Domänen-Listen basieren intern ebenfalls auf diesem neuen System und erlauben so auch, die voreingestellte Custom-Navigation zu ändern.

Um eine eigene @CustomNavigation zu erstellen muss eine Klasse mit der Java-Implementation zu den Projekt-Klassen hinzugefügt werden, und zwar in einem Java-Paket, dass in der jeweiligen Erweiterung als Custom-Logic-Package definiert ist.

Die Interaktion erfolgt über die Klasse CustomNavigationContext, die in Custom-Navigation-Methoden zur Verfügung steht und eine kleine programmatische DSL zur Darstellung von Navigationslinks bereitstellt.

@CustomLogic
public class BaseNavigationLogic
{
    @CustomNavigation("myextension.example-navigation")
    public void renderExampleNavigation(CustomNavigationContext context)
    {
        context.openListItem();  
        context.renderLink()
            .toExternalURL("http://opensaga.org")
            .withLabel("OpenSAGA")
            .close();
        context.closeListItem();
    }
}

In diesem Beispiel benutzen wir den automatisch herein gereichten Kontext um zuerst den umgebenden Listen-Eintrag des Navigations-Links zu erzeugen. Dann geben wir mit Hilfe der renderLink-Methode einen Link zur OpenSAGA-Website aus. renderLink gibt einen NavigationLinkBuilder zurück, der eine sprechende Schnittstelle zur Navigationslink-Darstellung bereitstellt.

So kann auf einfache Weise die OpenSAGA-Navigation um eigene Navigations-Elemente und/oder Strukturen erweitert werden.

Tags: , ,

Reply