我在XPage中创建了一个计算菜单,其中包含基于用户角色的渲染规则。 我的菜单值是根据计算字段中的视图计算的。 这是我的菜单代码:
<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>
我的数组中元素的值给出了这样的代码:
<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>
菜单显示正常,因此html代码正常。但是关于link2上的visibilty的xml部分没有。无论连接用户的角色如何,链接2都不可见。我认为这是一个问题,我将xml代码用于javascript代码。 也许是因为我的计算字段的内容类型是html,我的渲染代码是xml。
答案 0 :(得分:1)
您忘记将href
属性与撇号'
括起来:
<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>
答案 1 :(得分:1)
方法.contains()
区分大小写。确保ACL中设置的角色正好是[USER1]
。您呈现的代码对我来说很好。
您可以为渲染代码添加一些打印件以用于测试目的:
<xp:this.rendered>
<![CDATA[${javascript:
print(context.getUser());
print(context.getUser().getRoles());
context.getUser().getRoles().contains('[USER1]')}]]>
</xp:this.rendered>
您可以在服务器控制台上看到代码中真正发生的事情:
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>