XPage菜单中的动态渲染公式

时间:2016-05-12 14:17:29

标签: javascript html xml xpages lotus-domino

我在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。

2 个答案:

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

您可以在服务器控制台上看到代码中真正发生的事情:

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>