0

我想根据使用 Tapestry 登录的用户类型动态显示可用的页面链接菜单。

我的部分代码Layout.tml如下所示:

    <div class="header">
        <t:if t:test="userLoggedIn">
        <div class="menu">
            <ul>
                <t:loop t:type="loop" source="pageNames" value="pageName" class="prop:classForPageName">
                    <t:if t:test="isUserAllowedOnPage('pageName')">
                        <li>
                            <t:pagelink page="prop:pageName.name">${pageName.displayName}</t:pagelink>
                        </li>
                    </t:if>
                </t:loop>
            </ul>
        </div>
        </t:if>
        <div style="clear:both;"></div>
    </div>

在我的Layout.java我有以下方法:

public boolean isUserAllowedOnPage(String pageName) {
    // My logic here, returns either true or false
}

问题是,我不知道如何将实际的页面名称参数传递给isUserAllowedOnPage(String pageName)方法,因为使用下面的tml代码行
"isUserAllowedOnPage('pageName')" 我传递了一个实际的字符串,"pageName"而不是所需的值之一(例如,, , "Index"... )。"About""Contacts"

4

2 回答 2

6

您的循环指定value="pageName"这意味着 TapestrypageName每次迭代循环时都会更新您页面中的属性。因此,您不需要将它传递给方法,因为它已经在您每次调用该方法时设置。您可以执行以下操作:

TML

<t:loop source="pageNames" value="pageName">
    <t:if t:test="userAllowedOnPage">
        ...
    </t:if>
</t:loop>

爪哇

@Property
private List<String> pageNames;

@Property
private String pageName;
...
public boolean isUserAllowedOnPage() {
    // some calculation based on pageName
}
于 2013-07-31T08:06:50.333 回答
2

您可以将值传递给不带引号的方法,就像您在 java 代码中编写此表达式一样:

<t:if t:test="isUserAllowedOnPage(pageName)">
</t:if>

或者:

<t:if t:test="isUserAllowedOnPage(getPageName())">
</t:if>
于 2013-07-31T07:02:15.583 回答