我想创建一个标签:
#{some_tag entity:user, field:'name'}
并希望它使用以下表达式生成一些带有用户名的输出:
${_entity._field}
我知道它不起作用,但这就是我在这里问的原因。 有没有一种简单的方法可以使用作为参数传递给模板标记的字段名来获取字段值?
答案 0 :(得分:3)
当我需要这样做时,我做了类似于CRUD模块的事情。我将代码称为#{sometag 'entity.field' /}
然后在快速标签中(粗略地):
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(".", "?."));
答案 1 :(得分:2)
我不知道一个简单的答案,但它是可能的。您可以创建快速标记,并使用反射来获取您所追求的字段。 您可以在此处获取有关快速标记的更多信息 - Can someone explain how to use FastTags
但是,将特定字段发送到您的代码会不会更容易?
答案 2 :(得分:1)
参数存储在名为renderArgs的变量中。我不确定这是否可以在模板中直接访问,但如果这不起作用:
renderArgs.get(_entity)
然后你可以使用静态方法间接访问它:
Scope.RenderArgs.current().get(_entity)
访问该实体的命名字段是一个反思问题。
但是,我同意必须有一种更简单的方法。如果你发现自己正在做这样的反思,通常(并不总是)意味着你过度设计了一些东西。
答案 3 :(得分:1)
您可以将这些参数传递给使用反射来查找实际想要显示的字符串值的实用程序类。
${play.sample.util.ReflectUtil.get(_entity, _field)}
play.sample.util.ReflectUtil:
public static String get(String entity, String field) {
String displayValue = ... // look up value ...
return displayValue;
}
或者FastTag也可以。
答案 4 :(得分:0)
对我而言,这很简单。我有寻呼机标签:
#{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}