2016-05-12 6 views
1

XPagesで計算されたメニューを、ユーザーの役割に基づいてレンダリングされたルールで作成しました。 myメニューの値は、計算フィールドのビューから計算されます。 これは私のメニューコードです:私の配列例えば与える、このコードから要素のXPagesメニューの動的レンダリング式

<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> 

値:htmlコードはXML部分ok.Butあるので

<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> 

メニューが表示されます罰金link2上のvisibilityについてはありません。接続されたユーザーの役割に関係なく、リンク2は表示されません。私はそれがJavaScriptコードにXMLコードを使用するところで起こった問題だと思う。 おそらく、私の計算フィールドのコンテンツタイプがhtmlであり、レンダリングのためのコードがxmlであるためです。あなたはアポストロフィ'href属性囲むのを忘れて

答えて

1

<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

メニューがでたり、URLにアポストロフィなしで動作します。私はユーザーの役割に応じてレンダリングルールを置くときだけ動作しません。 – user3082877

1

方法.contains()大文字と小文字が区別です。 ACLに設定されているロールが正確に[USER1]であることを確認してください。あなたのレンダリングされたコードは私にとってうまくいく。

あなたはテスト目的のためにレンダリングされたコードにいくつかのプリントを追加できます:

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

をあなたが本当にあなたのコードで何が起こるか、サーバーコンソールで見ることができます:

enter image description here

href値を持っています引用符または一重引用符で囲む必要があります。それ以外の場合は、構文エラーが発生し、XPageで行った変更は無効になります。

更新

あなたのコメントで述べたように、あなたはHTMLを入れて、計算結果フィールドにJavaScriptコードが含まれていました。コンテンツはブラウザに直接送信され、この方法でJavaScriptコードがサーバー上で実行されないため、これは機能しません。

代わりに、メニュー項目を作成するために、リピート制御を使用します。

<?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

答えていただきありがとうございます。ブラウザにメニューコードを調べると、レンダリング部分がコメントされています。通常、レンダリングルールはサーバーによって解釈される必要があるため、ソースコードには表示されません。 <! - [CDATA [$ {javascript:context.getUser()。getRoles()。contains( '[USER1]')}]] - > user3082877

+0

プリントを追加しても、ソースコードを調べるときにコメントが付けられます。私はコンソールにプリントがありません。 – user3082877

+0

私は動作しているXPageで自分のコードを更新しました。そこから行ってください。 –

関連する問題