Templatedefinitionen mit Blossom

Das Blossom Modul ermöglicht die Springintegration in Magnolia. Dies ermöglicht dynamische Template-, Komponenten- und Dialogdefinitionen mittels Annotationen. Zudem können bereits bestehende Spring Applikationen in Magnolia integriert werden. In diesem Blog Post möchten wir uns die annotationsbasierte Templatedefinition genauer ansehen.

Templates

Um ein neues Seitentemplate anzulegen, benötigt man ein Spring-Bean welches um die Annotation @Template erweitert wird. Dieser Annotation muss die ID im Format <module-name>:pages/<page-name> und ein Titel mitgegeben werden. Zusätzlich kann ein externer Seitendialog und die Sichtbarkeit definiert werden.

@Controller
@Template(title = "Home Page",
    id = "test-module:pages/home")
public class HomeTemplate {

    @RequestMapping("/homeTemplate")
    public String render(Node page, ModelMap model) {
        model.put("title", PropertyUtil.getString(page, "title"));
        return "pages/main.jsp";
    }

}

Templateverfügbarkeit
Damit die Templateverfügbarkeit gesteuert werden kann, wird dem Template eine Methode mit der Annotation @Available hinzugefügt. Diese Methode enthält die Logik wann dieses Template angelegt werden darf.

@Available
public boolean isAvailable(Node node) throws RepositoryException {
    final String path = node.getParent().getPath();
    return StringUtils.equals(path, "/");
}

Areas

Areas werden als innere Klassen mit der Annotation @Area(„<area-name>“) im Seitentemplate definiert. Durch die Annotationen @AvailableComponentClasses und @AvailableComponents werden die zur Verfügung stehenden Blossom- resp. STK-Komponenten definiert. Mit @Inherits wird die Komponentenvererbung für diese Area aktiviert.

@Controller
@Area("main")
@AvailableComponentClasses({TextComponent.class, TextImageComponent.class})
@AvailableComponents({"form:components/form"})
public static class MainArea {
    @RequestMapping("/homeTemplate/main")
    public String render() {
        return "areas/main.jsp";
    }
}

Leider ist es momentan noch nicht möglich Areas von einem Basistemplate zu erben. Hoffentlich wird dieses Feature bald implementiert.

Komponenten

Auch Komponenten werden wie Seitentemplates mit @Template annotiert. Die ID wird jedoch im Format <module-name>:components/<component-name> definiert.

@Controller
@Template(title = "Text Image", id = "test-module:components/textimage")
public class TextImageComponent {

    @RequestMapping("/textimage")
    public String render() {
        return "components/textimage.jsp";
    }

}

Dialoge

Um einen externen Dialog zu erstellen, wird ein Spring-Bean mit @DialogFactory annotiert. Die einzelnen Tabs werden durch Methoden mit @TabFactory definiert.
Komponenten und Seitentemplates können mit @TabFactory und @TabOrder erweitert werden. Diese Methoden sind für die Dialoggenerierung und Anordnung der Tabs verantwortlich.

@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
    tab.fields(
        cfg.fields.text("title").label("Title"),
        cfg.fields.text("subtitle").label("Subtitle"),
        cfg.fields.richText("text").label("Text")
    );
}

 

Weitere Informationen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>