我们在整个地方都有重复的代码,我们希望能够在一个地方更改所有代码(我们正在测试从seam到playframework的端口)。我想为此创建一个标记文件(我已经创建了一些标签,但这个标签更难)。这是现在重复的代码......
<div>
<div class="entry">
<div class="spacer"></div>
#{field 'company.alias'}
<span class="label ${field.errorClass}">Company Alias:</span>
<span class="input ${field.errorClass}">
<input type="text" class="boxtpl" name="${field.name}" value="${company?.alias}">
<a id="newinfo" class="help" title="&{'help.companyAlias'}">Help</a>
<span class="error">${field.error}</span>
</span>
#{/field}
</div>
</div>
<div>
<div class="entry">
<div class="spacer"></div>
#{field 'company.name'}
<span class="label ">Company Name:</span>
<span class="input ">
<input type="text" class="boxtpl" name="${field.name}" value="${company?.name}">
<a id="newinfo" class="help" title="&{'help.companyName'}">Help</a>
<span class="error">${field.error}</span>
</span>
#{/field}
</div>
</div>
新标签的使用方式是这样的(或者如果我们能以某种方式管理它,可以这样使用)....
#{mynewtag label:'Company Name', name:'company.name', help:&{'help.companyName'}}
#{mynewtag label:'Company Alias', name:'company.alias', help:&{'help.companyAlias'}}
所以请注意,字段'company.name'所以我希望将其输入标签,并注意值=“$ {company?.name}”所以希望将该部分输入,然后最后&amp; {'help.companyName'}(基本上是3个位置,因为我知道如何做第4个标签)。然后,当我们更改此布局时,它会在我们的页面上进行更改。有没有办法在游戏中完成这个或没有?????
如果有#{field.value}就像#{field.name}那样会非常好,所以我只需传递三个参数而不是4个。
此外,在可访问性方面,我想我可以稍后使用此标记模板为所有字段轻松添加for属性,而无需在不同页面上编辑100个字段。
感谢, 迪安
答案 0 :(得分:3)
您必须创建自己的标记才能执行此操作。以下是您想要的基础知识。您可以在添加可选值以及要传递给标记的其他内容后对其进行修改
public class InputTag extends FastTags {
public static void _input(Map<?, ?> args, Closure body,
PrintWriter out,
ExecutableTemplate template,
int fromLine) {
String _name = args.get("name").toString();
String _label = args.get("label").toString();
String _help = args.get("help") == null ? null : args.get("help").toString();
play.data.validation.Error error = Validation.error(_name);
String[] pieces = _name.split("\\.");
Object _value = template.getProperty(pieces[0]);
if (_value != null) {
if (pieces.length > 1) {
for (int i = 1; i < pieces.length; i++) {
try {
Field f = _value.getClass().getField(pieces[i]);
if (i == (pieces.length - 1)) {
try {
Method getter = _value.getClass().getMethod(
"get" + JavaExtensions.capFirst(f.getName()));
_value = getter.invoke(_value, new Object[0]);
} catch (NoSuchMethodException e) {
_value = f.get(_value).toString();
}
} else {
_value = f.get(_value);
}
} catch (Exception e) {
// if problem reading the field dont set any value
}
}
}
}
if (_value == null) {
_value = "";
}
out.println("<div>");
out.println("<div class=\"entry\">");
out.println("<div class=\"spacer\"></div>");
out.println(String.format(" <span class=\"label\">%s</span>", _label));
out.println(" <span class=\"input\">");
out.println(String.format(" <input type=\"text\" class=\"boxtpl\" name=\"%s\" value=\"%s\">", _name, _value));
out.println(String.format("<a id=\"newinfo\" class=\"help\" title=\"%s\">Help</a>", Messages.get(_help)));
out.println(String.format("<span class=\"error\">%s</span>", (error == null ? "" : error.message())));
out.println(" </span>");
out.println("</div>");
}
}