2016-05-12 4 views
1

Ich erstellte ein berechnetes Menü in XPages mit gerenderten Regeln basierend auf Benutzerrollen. Die Werte meines Menüs werden aus einer Ansicht in einem berechneten Feld berechnet. Das ist mein Menü Code:Dynamische Render-Formel in XPages Menü

<div id='cssmenu'> 
<ul><li class='active has-sub'> 
<a href='#'>Title1</a> 
<ul> 
<xp:text escape="true" disableTheme="true" contentType="html"> 
<xp:this.value> 
<![CDATA[#{javascript:var arr= @DbColumn(@DbName(), "vwMenu", 4); 
arr.join("");}]]> 
</xp:this.value> 
</xp:text> 
</ul> 
</li> 
</ul> 
</div> 

Der Wert eines Elements aus meinem Array zum Beispiel gibt diesen Code:

<li class='has-sub'> 
<a href=https://mylink.com>Link1</a> 
<xp:panel> 
<xp:this.rendered> 
<![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]> 
</xp:this.rendered> 
<ul> 
    <li><a href=https://MyPage.com>Link2</a></li> 
</ul> 
</xp:panel> 
</li> 

Das Menü fein erscheint so der HTML-Code ist ok.but des XML-Teil bezüglich der Sichtbarkeit auf link2 nicht. Link 2 ist nicht sichtbar, unabhängig von der Rolle des verbundenen Benutzers. Ich denke, es ist ein Problem, das passiert ist, wo ich XML-Code in JavaScript-Code verwende. Vielleicht weil Der Inhaltstyp meines berechneten Feldes ist HTML und mein Code zum Rendern ist in XML.

Antwort

1

Sie haben vergessen, die href Attribute mit einem Apostroph ' einzuschließen:

<li class='has-sub'> 
      <a href='https://mylink.com'>Link1</a> 
      <xp:panel> 
       <xp:this.rendered> 
    <![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]> 
       </xp:this.rendered> 
       <ul> 
        <li> 
         <a href='https://MyPage.com'>Link2</a> 
        </li> 
       </ul> 
      </xp:panel> 
     </li> 
+0

Das Menü funktioniert mit oder ohne Apostroph in der URL. Es funktioniert nicht nur, wenn ich eine Rendering-Regel in Abhängigkeit von einer Benutzerrolle einstelle. – user3082877

1

Method .contains() ist Fall empfindlichen. Stellen Sie sicher, dass die in ACL festgelegte Rolle genau [USER1] ist. Ihr gerenderter Code funktioniert gut für mich.

Sie könnten einige Abzüge gemacht Code zu Testzwecken hinzufügen:

 <xp:this.rendered> 
      <![CDATA[${javascript: 
       print(context.getUser()); 
       print(context.getUser().getRoles()); 
       context.getUser().getRoles().contains('[USER1]')}]]> 
     </xp:this.rendered> 

Sie auf Server-Konsole sehen dann, was wirklich in Ihrem Code passiert:

enter image description here

Der href Wert hat von Anführungszeichen oder einfachen Anführungszeichen umgeben sein. Andernfalls würden Sie einen Syntaxfehler erhalten und Änderungen, die Sie an XPage vorgenommen haben, werden nicht wirksam.

aktualisieren

Wie Sie in Ihren Kommentaren erwähnt, setzen Sie den HTML-Code und enthalten JavaScript-Code in ein berechnetes Feld. Dies funktioniert nicht, da der Inhalt direkt an den Browser gesendet wird und auf diese Weise JavaScript-Code nicht auf dem Server ausgeführt wird.

Verwenden Sie stattdessen eine Wiederholungssteuerung die Menüpunkte zu erstellen:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view 
    xmlns:xp="http://www.ibm.com/xsp/core"> 
    <ul> 
     <li> 
      <a href="https://mylink.com">Link1</a> 
      <xp:panel> 
       <xp:this.rendered> 
        <![CDATA[${javascript: 
         context.getUser().getRoles().contains('[USER1]')}]]> 
       </xp:this.rendered> 
       <ul> 
        <xp:repeat 
         var="link"> 
         <xp:this.value><![CDATA[#{javascript: 
          ["https://MyPage.com", "https://www.google.com"] 
         }]]></xp:this.value> 
         <li> 
          <a href="#{link}"> 
           <xp:text escape="true" 
            value="#{javascript:'Link to ' + link}" /> 
          </a> 
         </li> 
        </xp:repeat> 
       </ul> 
      </xp:panel> 
     </li> 
    </ul> 
</xp:view> 
+0

Vielen Dank für Ihre Antwort. Wenn ich meinen Menücode in den Browser überprüfe, sehe ich, dass der Rendering-Teil kommentiert ist. Normalerweise wird die Renderregel nicht im Quellcode angezeigt, da sie vom Server interpretiert werden muss. user3082877

+0

Auch wenn ich die Drucke hinzufüge, werden sie kommentiert, wenn ich den Quellcode inspiziere. Ich habe keine Drucke auf der Konsole. – user3082877

+0

Ich habe meinen Code mit einer funktionierenden XPage aktualisiert. Geh von dort. –