- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Zugriff auf Elementen mit hilfe von ExecutableContextMenuItem im SiteArchitekt
Hallo zusammen,
ich mรถchte mit einem ExecutableContextMenuItem() eine oder mehrere Elemente zugreifen. Alles was ich habe, ist die ID von dem Ziel-Element (Page/Section oder Schema usw...).
Die gleiche Funktionalitรคt, die ich brauche, existiert bereits im SiteArchitekt unter dem Menu "Suchen/Suche nach ID". Da wenn man eine ID sucht und etwas findet, kann man das Element mit einem Klick einfach รถffnen.
Wie kann ich mich mit einem Klick auf meinem MenuItem innerhalb von SiteArchitekt bewegen.
ich suche eine Methode, mit der ich zu dem pagestore.Section-Element mithilfe der ID (z.B. 2786) zugreifen bzw. im SiteArchitekt รถffnen kann.
<SECTION editor="1" id="2786" name="Sc_myElement" releaseRevision="20783" releasedby="1" revision="21625" sectiontemplate="225">
<LANG displayname="Sc_myElement DE" language="DE"/>
<LANG displayname="Sc_myElement EN " language="EN"/>
</SESECTION >
Die Frage ist, gibt es so was unter den APIs (agency) und wรคre machbar alles in einem Modul zu entwickeln.
Ich bin dankbar fรผr jeden hinweis
Viele Grรผรe,
Ahmad
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Ahmad,
der Vollstรคndigkeit halber: Wichtig ist die Unterscheidung zwischen
- ID: numerisch [Long], eindeutig pro FS-Server, praktisch fรผr alle Objekte vorhanden
und - UID: auch "Referenzname" genannt, Typ String, eindeutig nur innerhalb gewisser "Namensrรคume", nicht fรผr alle Objekte vorhanden
Was schonmal nicht geht: Oft holt man sich ja Elemente รผber die UID mit dem StoreElementAgent (was in Deinem Fall nicht geht, weil z.B. Sections eben keine UID haben).
รber den Umweg des StoreAgent wiederum jeden einzelnen Store nach dem Element mit der entsprechenden ID zu fragen, wรผrde eine Menge Boilerplate-Code bedeuten: Jeden StoreRoot holen und dann auf jedem .getStoreElement(long id) aufrufen und schauen ob Du etwas bekommst - auch nicht schรถn.
Von daher wรผrde ich in Deinem Fall den QueryAgent nutzen, um direkt nach der ID zu fragen. Zum Anzeigen kannst Du dann letztlich die DisplayElementOperation nehmen, an die Du รผber den OperationAgent kommst. Hier muss im Aufruf von .perform(IDProvider) einfach nur das Objekt รผbergeben werden. In etwa sollte das dann so aussehen - mit dem ContextMenuContext, der in die execute(...)-Methode hereingereicht wird, hast Du ja einen SpecialistsBroker๐
long id = .... //your id
QueryAgent queryAgent = context.requireSpecialist(QueryAgent.TYPE);
Iterable<IDProvider> iterable = queryAgent.answer("fs.id="+id);
Iterator<IDProvider> iterator = iterable.iterator();
if(iterator.hasNext()){
IDProvider idProvider = iterator.next();
DisplayElementOperation displayElementOperation = context.requireSpecialist(OperationAgent.Type).getOperation(DisplayElementOperation.TYPE);
displayElementOperation.perform(idProvider);
}
Da die ID eindeutig ist, muss man hier nicht iterieren sondern nimmt einfach das erste Ergebnis (wenn es eines gibt).
Den Code kann man natรผrlich auch etwas kompakter schreiben, ich habe es zum besseren Verstรคndnis mal schrittweise gemacht.
Wichtig ist hier noch, dass der QueryAgent nur auf dem Current-Stand arbeitet - aber da Du das ja als Aktion im SA nutzen willst, sollte es passen.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Ahmad,
der Vollstรคndigkeit halber: Wichtig ist die Unterscheidung zwischen
- ID: numerisch [Long], eindeutig pro FS-Server, praktisch fรผr alle Objekte vorhanden
und - UID: auch "Referenzname" genannt, Typ String, eindeutig nur innerhalb gewisser "Namensrรคume", nicht fรผr alle Objekte vorhanden
Was schonmal nicht geht: Oft holt man sich ja Elemente รผber die UID mit dem StoreElementAgent (was in Deinem Fall nicht geht, weil z.B. Sections eben keine UID haben).
รber den Umweg des StoreAgent wiederum jeden einzelnen Store nach dem Element mit der entsprechenden ID zu fragen, wรผrde eine Menge Boilerplate-Code bedeuten: Jeden StoreRoot holen und dann auf jedem .getStoreElement(long id) aufrufen und schauen ob Du etwas bekommst - auch nicht schรถn.
Von daher wรผrde ich in Deinem Fall den QueryAgent nutzen, um direkt nach der ID zu fragen. Zum Anzeigen kannst Du dann letztlich die DisplayElementOperation nehmen, an die Du รผber den OperationAgent kommst. Hier muss im Aufruf von .perform(IDProvider) einfach nur das Objekt รผbergeben werden. In etwa sollte das dann so aussehen - mit dem ContextMenuContext, der in die execute(...)-Methode hereingereicht wird, hast Du ja einen SpecialistsBroker๐
long id = .... //your id
QueryAgent queryAgent = context.requireSpecialist(QueryAgent.TYPE);
Iterable<IDProvider> iterable = queryAgent.answer("fs.id="+id);
Iterator<IDProvider> iterator = iterable.iterator();
if(iterator.hasNext()){
IDProvider idProvider = iterator.next();
DisplayElementOperation displayElementOperation = context.requireSpecialist(OperationAgent.Type).getOperation(DisplayElementOperation.TYPE);
displayElementOperation.perform(idProvider);
}
Da die ID eindeutig ist, muss man hier nicht iterieren sondern nimmt einfach das erste Ergebnis (wenn es eines gibt).
Den Code kann man natรผrlich auch etwas kompakter schreiben, ich habe es zum besseren Verstรคndnis mal schrittweise gemacht.
Wichtig ist hier noch, dass der QueryAgent nur auf dem Current-Stand arbeitet - aber da Du das ja als Aktion im SA nutzen willst, sollte es passen.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
vielen Dank fรผr deine schnelle & ausfรผhrliche Antwort.
Ich kann es nicht glauben, dass es funktioniert
Ich habe mal mit dem UIViewAgent versucht, aber habe leider keinen Erfolg. Dein Code funktioniert sauber.
Nochmal ein fettes Dankeschรถn.
Viele Grรผรe,
Ahmad
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Ahmad,
freut mich, dass es klappt ๐
Der UIViewAgent ist รผbrigens nicht Teil der รถffentlichen API - von sowas sollte man unbedingt die Finger lassen. Wenn irgendwas nicht im ApiDoc steht, hat das was zu bedeuten ๐
Viele Grรผรe
Michael

