mstaender
I'm new here

Toolbar im SiteArchitect als "Project Component"

Jump to solution

Hi,

ich habe mir jetzt eine Zeit lang die Doku durchgelesen aber blicke immer noch nicht ganz durch wie ich eine Komponente als "Project Component" definieren muss, damit man in den Projekteinstellungen definieren kann, ob diese nun geladen wird oder nicht.

In meinem Fall habe ich eine Toolbar für den SA, welche wie folgt definiert ist:

<public>

   <name>Toolbar SiteArchitect</name>

   <displayname>XqSaToolbarItemsPlugin: show items for XQ Maileon newsletters in SiteArchitect</displayname>

   <class>de.xqueue.firstspirit.toolbar.sitearchitect.XqToolbarItemsPlugin</class>

</public>

Ich drehe mich etwas im Kreis, ohne wirklich herausgefunden zu haben wie ich nun was deklarieren muss. Könnte mir bitte jemand einen kleinen Hinweis in die richtige Richtung geben?

MfG Marcus

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Marcus,

der "Trick" ist hier, dass die Toolbar selber eben nicht als Projektkomponente deklariert wird sondern so wie Du es gemacht hast als PUBLIC-Komponente. Du muss jetzt lediglich dafür sorgen, dass sie nur "in den passenden Projekten" angezeigt wird. Wichtig zu verstehen ist hier, dass das Toolbar-Plugin zwar in jedem Projekt grundsätzlich erstmal geladen wird (das kann man nicht weiter steuern), aber in den "unpassenden" Projekten "unsichbar" bleibt. Üblicherweise macht man das, indem die .getItems()-Methode dann eben nur eine leere Collection liefert.

D.h. Du brauchst innerhalb der .getItems()-Methode eine Abfrage die prüft, ob das entsprechende Feature für das aktuelle Projekt "aktiviert" ist. Hier sind grundsätzlich diverse Varianten möglich. Die "sauberste" und übliche Methode ist hier aber die Nutzung einer ProjectApp. Wenn es nur um das grundsätzliche "ist aktiv oder nicht" geht, hat diese ProjectApp ehe Dummy-Charakter, d.h. man schaut dann im Code einfach, ob sie dem aktuellen Projekt unter "Projektapplikationen" hinzugefügt wurde oder eben nicht.

Das Vorgehen dazu: Du erzeugst zusätzlich eine Projektkomponente (siehe Post von André), also eine Klasse die das ProjectApp-Interface implementiert. Diese Klasse (z.B. XqProjectApp) gibst Du dann auch in der module.xml als <project-app> an. Die Methoden kannst Du dabei leer lassen.

Sobald das gemacht ist, kannst Du diese ProjectApp einzelnen Projekten im ServerManager hinzufügen.

Was Du jetzt noch brauchst ist die entsprechende Abfrage im Code. Das kannst Du einmal natürlich selber bauen, ich habe aber vor einiger Zeit mal die GenericConfig gebaut, die eigentlich zur Konfiguration solcher ProjectApps gedacht ist. Es gibt dort aber auch eine Utility-Methode, um festzustellen ob eine ProjectApp im aktuellen Projekt hinzugefügt ist. Auch wenn Du GenericConfig gar nicht zum Konfigurieren nutzt (also gar kein "Configurable" hast) solltest Du die Methode nutzen können sobald Du GenericConfig einbindest.

boolean projectAppIsInstalled = GenericConfigPanel.isInstalled(XqProjectApp.class, broker);

Dabei ist dann "MyProjectApp" Deine entsprechende ProjectApp-Klasse, der broker ist ein SpecialistsBroker mit Projektbindung. Der steht in Deinem Plugin im Rahmen der setUp-Methode zur Verfügung.

D.h. in Deinem XqToolbarItemsPlugin steht dann zusätzlich sowas drin:

public class XqToolbarItemsPlugin implements JavaClientEditorialToolbarItemsPlugin {

     ...

     private boolean projectAppIsInstalled;

    

     @Override

     void setUp(BaseContext context){

          projectAppIsInstalled = GenericConfigPanel.isInstalled(XqProjectApp.class, context);

     }

    

     @Override

     Collection<? extends JavaClientToolbarItem> getItems(){

          if(!projectAppIsInstalled){

               return Collections.emptyList();

          }

          ... //hier dann Dein Code der die Items erzeugt

     }

    

  ...

}

Falls Du GenericConfig nicht einbinden willst, ist hier der Code der darin benutzt wird um das "Project App ist installiert" zu prüfen:

     public static  boolean isInstalled(final Class<? extends ProjectApp> projectAppClass,final SpecialistsBroker specialistsBroker){

        final Collection<ComponentDescriptor> components = specialistsBroker.requestSpecialist(ModuleAgent.TYPE).getComponents(projectAppClass);

        if (!components.isEmpty()) {

            final ComponentDescriptor component = components.iterator().next();

            final Collection<Project> projects = specialistsBroker.requestSpecialist(ModuleAdminAgent.TYPE).getProjectAppUsages(component.getModuleName(), component.getName());

            final long projectId = specialistsBroker.requireSpecialist(ProjectAgent.TYPE).getId();

            for (final Project project : projects) {

                if (project.getId() == projectId) {

                    return true;

                }

            }

        }

        return false;

    }

Wenn Du diese statische Methode direkt in die ProjectApp-Klasse einbaust, kannst Du natürlich auf die Übergabe der ProjectApp-Klasse verzichten und sie dort "hart" reincodieren, so dass dann der Aufruf etwas kürzer wird, z.B.

projectAppIsInstalled = XqProjectApp.isInstalled(context);

Viele Grüße

Michael

View solution in original post

0 Kudos
3 Replies
abiegel
New Creator

Hallo Markus,

ich muss zu geben , dass ich solch eine Komponente noch nicht geschrieben habe .. Aber in der ODFS  unter

help/odfs/plug-developmen/examples/module-editoria/index.html

ist ein Beispiel. welches sich wie dein Use Case anhört ..

Vllt hilft dir das weiter..

in der Module-xml der Sourcen ist das  dermaßen drin ...

    <project-app>
        <name>EditorialSARProjectApp</name>
        <displayname>Editorial Search and Replace: Project Application</displayname>
        <class>de.espirit.firstspirit.opt.example.editorialsar.projectapp.EditorialSARProjectApp</class>
        <configurable>de.espirit.firstspirit.opt.example.editorialsar.projectapp.EditorialSARProjectAppConfiguration</configurable>
    </project-app>

Gruß André

0 Kudos
mbergmann
Crownpeak employee

Hallo Marcus,

der "Trick" ist hier, dass die Toolbar selber eben nicht als Projektkomponente deklariert wird sondern so wie Du es gemacht hast als PUBLIC-Komponente. Du muss jetzt lediglich dafür sorgen, dass sie nur "in den passenden Projekten" angezeigt wird. Wichtig zu verstehen ist hier, dass das Toolbar-Plugin zwar in jedem Projekt grundsätzlich erstmal geladen wird (das kann man nicht weiter steuern), aber in den "unpassenden" Projekten "unsichbar" bleibt. Üblicherweise macht man das, indem die .getItems()-Methode dann eben nur eine leere Collection liefert.

D.h. Du brauchst innerhalb der .getItems()-Methode eine Abfrage die prüft, ob das entsprechende Feature für das aktuelle Projekt "aktiviert" ist. Hier sind grundsätzlich diverse Varianten möglich. Die "sauberste" und übliche Methode ist hier aber die Nutzung einer ProjectApp. Wenn es nur um das grundsätzliche "ist aktiv oder nicht" geht, hat diese ProjectApp ehe Dummy-Charakter, d.h. man schaut dann im Code einfach, ob sie dem aktuellen Projekt unter "Projektapplikationen" hinzugefügt wurde oder eben nicht.

Das Vorgehen dazu: Du erzeugst zusätzlich eine Projektkomponente (siehe Post von André), also eine Klasse die das ProjectApp-Interface implementiert. Diese Klasse (z.B. XqProjectApp) gibst Du dann auch in der module.xml als <project-app> an. Die Methoden kannst Du dabei leer lassen.

Sobald das gemacht ist, kannst Du diese ProjectApp einzelnen Projekten im ServerManager hinzufügen.

Was Du jetzt noch brauchst ist die entsprechende Abfrage im Code. Das kannst Du einmal natürlich selber bauen, ich habe aber vor einiger Zeit mal die GenericConfig gebaut, die eigentlich zur Konfiguration solcher ProjectApps gedacht ist. Es gibt dort aber auch eine Utility-Methode, um festzustellen ob eine ProjectApp im aktuellen Projekt hinzugefügt ist. Auch wenn Du GenericConfig gar nicht zum Konfigurieren nutzt (also gar kein "Configurable" hast) solltest Du die Methode nutzen können sobald Du GenericConfig einbindest.

boolean projectAppIsInstalled = GenericConfigPanel.isInstalled(XqProjectApp.class, broker);

Dabei ist dann "MyProjectApp" Deine entsprechende ProjectApp-Klasse, der broker ist ein SpecialistsBroker mit Projektbindung. Der steht in Deinem Plugin im Rahmen der setUp-Methode zur Verfügung.

D.h. in Deinem XqToolbarItemsPlugin steht dann zusätzlich sowas drin:

public class XqToolbarItemsPlugin implements JavaClientEditorialToolbarItemsPlugin {

     ...

     private boolean projectAppIsInstalled;

    

     @Override

     void setUp(BaseContext context){

          projectAppIsInstalled = GenericConfigPanel.isInstalled(XqProjectApp.class, context);

     }

    

     @Override

     Collection<? extends JavaClientToolbarItem> getItems(){

          if(!projectAppIsInstalled){

               return Collections.emptyList();

          }

          ... //hier dann Dein Code der die Items erzeugt

     }

    

  ...

}

Falls Du GenericConfig nicht einbinden willst, ist hier der Code der darin benutzt wird um das "Project App ist installiert" zu prüfen:

     public static  boolean isInstalled(final Class<? extends ProjectApp> projectAppClass,final SpecialistsBroker specialistsBroker){

        final Collection<ComponentDescriptor> components = specialistsBroker.requestSpecialist(ModuleAgent.TYPE).getComponents(projectAppClass);

        if (!components.isEmpty()) {

            final ComponentDescriptor component = components.iterator().next();

            final Collection<Project> projects = specialistsBroker.requestSpecialist(ModuleAdminAgent.TYPE).getProjectAppUsages(component.getModuleName(), component.getName());

            final long projectId = specialistsBroker.requireSpecialist(ProjectAgent.TYPE).getId();

            for (final Project project : projects) {

                if (project.getId() == projectId) {

                    return true;

                }

            }

        }

        return false;

    }

Wenn Du diese statische Methode direkt in die ProjectApp-Klasse einbaust, kannst Du natürlich auf die Übergabe der ProjectApp-Klasse verzichten und sie dort "hart" reincodieren, so dass dann der Aufruf etwas kürzer wird, z.B.

projectAppIsInstalled = XqProjectApp.isInstalled(context);

Viele Grüße

Michael

0 Kudos

Hi Michael,

nachdem ich zunächst versucht habe die Toolbar direkt als ProjectApp zu definieren und dann daran scheiterte sie überhaupt anzeigen zu lassen habe ich diesen Weg getestet und er funktioniert super. Danke für die ausführliche Erklärung... und wieder etwas gelernt Smiley Happy

MfG Marcus

0 Kudos