Playframework 玩如何检索模板标记中的字段值,该标记将实体和字段名分别作为参数传递?

Playframework 玩如何检索模板标记中的字段值,该标记将实体和字段名分别作为参数传递?,playframework,Playframework,我想创建一个标签,如: #{some_tag entity:user, field:'name'} 并希望它使用以下表达式生成一些包含用户名的输出: ${_entity._field} 我知道它不起作用,但这就是为什么我在这里问。 有没有一种简单的方法可以使用作为参数传递给模板标记的字段名来获取字段值 我不知道一个简单的答案,但这是可能的。您可以创建一个快速标记,并使用反射来获取所需的字段。 您可以在此处获得有关快速标签的更多信息- 然而,仅仅将特定字段发送到您的标签不是更容易吗?对我来说,

我想创建一个标签,如:

#{some_tag entity:user, field:'name'}
并希望它使用以下表达式生成一些包含用户名的输出:

${_entity._field}
我知道它不起作用,但这就是为什么我在这里问。
有没有一种简单的方法可以使用作为参数传递给模板标记的字段名来获取字段值

我不知道一个简单的答案,但这是可能的。您可以创建一个快速标记,并使用反射来获取所需的字段。 您可以在此处获得有关快速标签的更多信息-


然而,仅仅将特定字段发送到您的标签不是更容易吗?

对我来说,它的工作方式很简单。我有寻呼机标签:

#{pager model:productList, totalCount:total /}
在pager.tag中,我有:

<div class="total">${_totalCount}</div>
<ul>
#{list items:_model.getStartPage(params.pageNumber).._model.getPageCount(params.pageNumber), as:'i'}
%{selectedClass=i.toString()==(params.pageNumber==null? "1" : params.pageNumber)?"selected":""%}
<li class="${selectedClass}">
    #{if selectedClass == "selected"}
    <span>${i}</span>
    #{/if}
    #{else}
    <a href="@{Product.list(params.categoryId, params.rangeStart, params.rangeEnd, params.brandId, i, params.pageSize, params.q)}">${i}</a>
    #{/else}
</li>
#{/list}
${u totalCount}
    #{列出项目:_model.getStartPage(params.pageNumber)..\u model.getPageCount(params.pageNumber),形式为:'i'} %{selectedClass=i.toString()==(params.pageNumber==null?“1”:params.pageNumber)?“selected”:“%}
  • #{如果selectedClass==“selected”} ${i} #{/if} #{else} #{/else}
  • #{/list}

参数存储在名为renderags的变量中。我不确定这是否可以在模板内直接访问,但如果这不起作用:

renderArgs.get(_entity)
然后,您可能可以使用静态方法间接访问它:

Scope.RenderArgs.current().get(_entity)
访问该实体的命名字段则是一个反射问题


然而,我同意必须有一个更简单的方法的建议。如果您发现自己这样做反射,通常(并非总是)意味着您过度设计了一些东西。

您可以将这些参数传递给一个实用程序类,该类使用反射来查找您实际想要显示的字符串值

${play.sample.util.ReflectUtil.get(_entity, _field)}
play.sample.util.reflectil:

public static String get(String entity, String field) {
    String displayValue = ... // look up value ... 
    return displayValue;
}

或者FastTag也可以工作。

当我需要这样做时,我做了一些类似于CRUD模块的事情。我将标记称为
{sometag'entity.field'/}

然后在fast标记中,我(大致):


我必须同时使用字段名和字段值,所以我想压缩参数列表。如果没有简单的方法,我将使用扩展参数列表。很抱歉,读了您的代码好几遍,我仍然不知道回答我问题的部分在哪里。您的问题是:如何将实体和字段名传递给模板标记,对吗?我刚刚向您展示了一个如何实现这一点的工作示例。也许我错过了什么。就我所见,你传递了一些实体和数字。代码中没有使用字段名称(不是作为参数传递的值)获取字段值的位置。仔细查看问题中给出的示例。代码中的_model.getStartPage。可以使用与方法相同的方法调用字段。也许我只是误解了你的问题。很抱歉
String[] parts = args.get("arg").split("\\.");
Object entity = play.mvc.Scope.RenderArgs.current().get(parts[0]);
String field = String.valueOf(parts[1]);
Object value = groovy.util.Eval.me("_caller", template.template, "_caller." + args.get("arg").replace(".", "?."));