2012-02-04 73 views
1

我们在所有地方都有重复的代码,我们希望能够在一个地方更改所有代码(我们正在测试从接缝到playframework的端口)。我想为此创建一个标记文件(我已经创建了一些标记,但这个标记更难)。下面是代码,现在重复....如何在playframework模板中制作更复杂的标签#{field}?

<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}”,以便将该部分引入,然后最终生成& { 'help.companyName'}(基本上3个位置,因为我知道如何做第四个标签)。然后,当我们改变这个布局时,它会改变我们的页面。有没有办法在比赛中完成这个或没有?

这将是非常好的,如果有一个#{} field.value像#{} field.name所以我只会有三种paramters传递的4

而且,当它来代替来到可访问性,我想我可以在以后使用此标记模板的所有字段轻松添加for属性,而无需在不同页面上编辑100个字段。

感谢, 院长

+0

您试图重构您的“字段”标签还是要创建新标签?我们称之为“条目“,用周围的'div'和嵌套的”field“标签打印出”entry“'div'? – Carsten 2012-02-04 17:27:58

+0

我只是想将上面的代码更改为一个标记文件并像这样使用它#{mynewtag label:'Company Name',name:'company.name',help:&{'help.companyName'}} AND#{ mynewtag label:'Company Alias',name:'company.alias',help:&{'help.companyAlias'}} – 2012-02-06 01:41:02

回答

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