2012-08-13 5 views
5

Ich möchte Aktionen dynamisch in PlaceBar hinzufügen (extlib oneui Anwendungslayout).XPages extlib oneui Layout - So fügen Sie placebar Aktionen dynamisch hinzu

Wir haben einige URLs in einigen Konfigurationsdokumenten gespeichert. Basierend auf diesen URLs möchte ich Container-Knoten mit Basic Child-Knoten erstellen. Jeder untergeordnete Knoten verwendet eine URL aus der Liste. Wie kann ich Containerknoten erstellen und dynamisch Kindknoten hinzufügen? irgendein Probe SSJS/Java/CSJS Code für dieses?

Danke ..

Antwort

1

Vielen Dank für die schnelle Antwort. Dies ist eine sehr nützliche Information für mich.

Eine andere Möglichkeit, die ich auf XSnippet-Code und einige umgekehrte Engg herausfand. von Java-Code in xpage wie folgt:

var oneui = getComponent("applicationLayout1"); 
var uiConfig = oneui.getConfiguration(); 
var containerNode:com.ibm.xsp.extlib.tree.complex.ComplexContainerTreeNode = new com.ibm.xsp.extlib.tree.complex.ComplexContainerTreeNode(); 
containerNode.setLabel("Cluster Applications"); 

var docAppProfile = docColl.getFirstDocument(); 
while(docAppProfile != null) 
{ 
    var children:com.ibm.xsp.extlib.tree.complex.ComplexLeafTreeNode = new com.ibm.xsp.extlib.tree.complex.ComplexLeafTreeNode(); 
    children.setComponent(oneui); 
    children.setLabel(docAppProfile.getItemValueString("appTitle")); 
    children.setHref(docAppProfile.getItemValueString("appURL")); 
    children.setImage(docAppProfile.getItemValueString("appLogoThumb")); 
    containerNode.addChild(children); 

    children = null; 
    var tempDoc = docColl.getNextDocument(docAppProfile); 
    docAppProfile = null; 
    docAppProfile = tempDoc; 
} 
uiConfig.addPlaceBarAction(containerNode); 

Dies ist nur Beispielcode. Konvertiert dies in Java-Code und serialisiert, um die Leistung zu verbessern und es nur einmal in der Anwendung zu laden.

Nochmals vielen Dank für Ihre Hilfe.

4

einen Blick auf die Repeat Knoten haben (xe:repeatTreeNode), die 245. in der XPages Extension Library Buch auf Seite beschrieben wird

Hier ist ein sehr einfaches Beispiel (direkt aus dem Buch):

0

Eine andere Sache, die Sie tun können, ist, einen PhaseListener zu verwenden, um die Einzelteile in Ihren Behälter-Knoten vor der Wiedergabe-Antwort zu injizieren. Dann könnten Sie es an einem einzigen Ort für alle Ihre Seiten kontrollieren.

+0

Aufruf einer SSJS Funktion in Pro Vorbild tun würde, auch für alle Seiten oder, wie empfohlen, setzen Sie das Layout in einem benutzerdefinierten Steuerelement und verwenden, die überall. Aber eine Phase Listener wäre sicher eine interessante Übung – stwissel

+0

Hallo Toby, haben Sie einen Beispielcode für die Art und Weise, um Elemente in PhaseListener zu injizieren? lass es mich wissen, bitte. Vielen Dank. –

+0

Ich habe den Code als Antwort hinzugefügt. –

1

im Grunde ist es der gleiche Code, den Sie oben aufgeführt, aber in Java. und dann diese kleinen Code in der Datei faces-config.xml

<lifecycle> 
    <phase-listener>com.company.app.phaselisteners.PlaceBarInjector</phase-listener> 
</lifecycle> 

package com.company.app.phaselisteners; 





public class PlaceBarInjector implements PhaseListener { 

     private static final long serialVersionUID = 1L; 

     public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
    } 

    public void beforePhase(PhaseEvent event) { 
     UIComponent oneui = JSFUtil.findComponent("applicationLayout1"); 
    Configruation uiconfig = oneui.getConfiguration(); 
    ComplexContainerTreeNode containerNode = new ComplexContainerTreeNode(); 
    containerNode.setLabel("Cluster Applications"); 

    Document docAppProfile = docColl.getFirstDocument(); 
    while(docAppProfile != null) 
    { 
      ComplexLeafTreeNode children = new ComplexLeafTreeNode(); 
      children.setComponent(oneui); 
      children.setLabel(docAppProfile.getItemValueString("appTitle")); 
     children.setHref(docAppProfile.getItemValueString("appURL")); 
      children.setImage(docAppProfile.getItemValueString("appLogoThumb")); 
      containerNode.addChild(children); 

      Document tempDoc = docColl.getNextDocument(docAppProfile); 
      docAppProfile = tempDoc; 
    } 
    uiConfig.addPlaceBarAction(containerNode); 
    } 

    public void afterPhase(PhaseEvent event) { 
     System.out.println("END PHASE " + event.getPhaseId()); 
    } 

}