如何在游戏框架模板#{field}中制作更复杂的标签?

时间:2012-02-04 17:10:47

标签: playframework

我们在整个地方都有重复的代码,我们希望能够在一个地方更改所有代码(我们正在测试从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个字段。

感谢, 迪安

1 个答案:

答案 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>");
}
}