Aller au contenu principal

GidAgent in navigation_service_custom_data nicht verfügbar

Commentaires

7 commentaires

  • Holger Höbbel

    Hallo Fabian,

    der GidAgent benötigt einen Projekt-Kontext und kann nur von Administratoren ausgeführt werden.
    Eine der beiden Voraussetzungen ist in deinem Anwendungsfall nicht erfüllt.

    Ich vermute, dass der Projekt-Kontext fehlt, z.B. weil das Skript als Server-Skript (ServerManager=>Server/Eigenschaften/Auftragsverwaltung) ausgeführt wird. 

    Lösung wäre in diesem Fall dir erst das entsprechende Projekt zu holen und dort über einen projektlokalen Broker dir den GIDAgent zu holen.

    Beispielcode, um für jedes Projekt den GIDAgent zu holen:

    import de.espirit.firstspirit.access.AdminService;
    import de.espirit.firstspirit.access.ServicesBroker;
    import de.espirit.firstspirit.agency.*;
    import de.espirit.firstspirit.common.GidAgent;

    broker = context.getConnection().getBroker();
    adminService = context.requireSpecialist(ServicesBroker.TYPE).getService(AdminService.class);
    projects = adminService.getProjectStorage().getProjects();
    for (project:projects) {
    projectBroker = broker.requireSpecialist(BrokerAgent.TYPE).getBrokerByProjectId(project.getId());
    gidAgent = projectBroker.requireSpecialist(GidAgent.TYPE);
    }

    Wenn es statt dessen die fehlenden Admin-Rechte sind, dann muss das Skript mit einem Admin-User ausgeführt werden. 

    Ich hoffe, dass du anhand dieser Antwort die Ursache des Problems identifizieren kannst und das Problem dann entsprechend lösen kannst.

    Viele Grüße
    Holger

    0
  • Fabian König

    Hallo Holger,

    vielen Dank für deine ausführliche Antwort und den Beispielcode.

    Leider scheint es so zu sein, dass das navigation_service_custom_data nicht mit Admin-Rechten läuft. Wenn ich deinen obigen Code ausprobiere, erhalte ich nämlich diese Fehlemeldung:

    Die preview Navigation für das Projekt rheinenergie.com - Horizontale Navigation konnte nicht aktualisiert werden.

    Ursache: Error while generating navigation custom data for idProvider SiteStoreRoot (ID=...) (GID: 5...6) in language de_DE. This is most likely caused by an error in the project specific script 'navigation_service_custom_data'. You can find the detailed stack trace in the fs server log. Error message is: Error in method invocation: Method getConnection() not found in class'de.espirit.firstspirit.access.BaseContextImpl' : at Line: 12 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.access.store.pagestore.Page; import  . . . '' : context .getConnection ( )

    Called from method: __execute at line 12..

    Weitere Informationen finden Sie im FirstSpirit Server Log.
    Ich konnte in der Doku zum Navigation Service auch nichts zu den Rechten des Skripts finden.
     
    Gibt es da noch eine Möglichkeit oder geht es dann einfach nicht?
     
    Viele Grüße
    Fabian
     
    0
  • Holger Höbbel

    Hallo Fabian,

    leider kenne ich mich mit dem Navigation Service nicht aus, so dass ich anhand der bisherigen Informationen keine sinnvolle Antwort geben kann. Deshalb ein paar Kontextfragen:

    Wo wird denn das Skript ausgeführt?
    Hintergrund der Frage ist, dass die meisten Kontexte, in denen Skripte ausgeführt werden, das Interface ScriptContext implementieren und somit die Methode getConnection() haben.

    Wofür genau brauchst Du den GID-Agen? 
    Diese Frage zielt darauf ab, ob es nicht eine andere Möglichkeit gibt, die Aufgabe zu lösen. Beispiel: Bei Datasets könnte man sich beispielsweise die GID mittels <dataset>.getEntity().getGid() holen.

    Viele Grüße,
    Holger

    0
  • Fabian König

    Hallo Holger,

    soweit ich das verstehe, wird das Skript automatisch ausgeführt, wenn der Navigation Service auf eine Änderung im Projekt reagier und die Informationen im Navigation Service neu geschrieben bzw. upgedatet werden. Dabei wird das Skript für jeden Knoten im SiteStore aufgerufen und man hat die Chance eigene Daten zu dem jeweiligen Eintrag in den NavigationService zu schreiben.
    Der Kontext den man im Skript zur Verfügung hat ist vom Typ de.espirit.firstspirit.access.BaseContextImpl - das scheint das von dir genannte Interface leider nicht zu implementieren.

    Eigentlich benötige ich "nur" die GID eines Elements vom Typ PageRef. Ich habe aber in der API leider keine Methode getGid() o.ä. für Seiten gefunden, sondern nur für Datasets (wie du auch erwähnt hast). Daher ging ich davon aus, dass ich den Umweg über den GID-Agent gehen muss. Wenn es hier noch eine andere Möglichkeit gäbe, wäre das klasse!

    Viele Grüße
    Fabian

     

     

    0
  • Peter Jodeleit

    Wie Holger schreibt, ist nicht jeder Agent in jedem Kontext verfügbar. Wenn du deinen Use-Case ohne den GID Agent nicht lösen kannst, dann lege doch bitte ein Support-Ticket dafür an und schildere deinen Use-Case (also wofür wird die GID fachlich benötigt), damit geprüft werden kann, ob der benötigte Agent bereitgestellt werden kann.

    0
  • Jan-Philipp Nierlein

    Hi Fabian,
    ich habe mir das genauer angeguckt. Wenn du dir den GIDAgent so holst, sollte es funktioieren:

    gidAgent = context.requestSpecialist(BrokerAgent.TYPE).getBrokerByProjectId(e.project.id).requestSpecialist(GidAgent.TYPE);

    Wir werden aber auch am Modul etwas anpassen, so dass dann ab einer der nächsten Versionen der GidAgent so geholt werden kann, wie du es ursprünglich erwartet hattest.
    Viele Grüße
    Jan

    0
  • Fabian König

    Hi Jan,

    vielen Dank, das funktioniert!

    Und klasse, dass ihr das anpasst.

    Viele Grüße
    Fabian

    0

Vous devez vous connecter pour laisser un commentaire.