开发者

Elegant way to bind html radio buttons <=> Java enums <=> mysql enums in Play?

The Goal is to have a list of options (that a user can chose through radio buttons) in one place(for eg: a yaml config file). No other place should have t开发者_运维百科his list hard-coded


I've done something similar to create select elements, and I think enums worked just fine. Doing radio buttons should be very similar. I've set it up so that the labels can be defined in the messages file. I'm going to try to excerpt the relevant portions from my larger auto-form-generation code (using FastTags) the best I can. It's a bit heavy for this one case but it makes sense in the larger system.

I use the tag like #{form.selector 'order.status' /}, which looks find the variable named order in the template, sees that status is declared as public Status status, and then goes to find all the values of the Status enum and generate options for them in the select element.

First, I use a FieldContext object which just contains a bunch of info that's used by the other code to determine what to generate along with some utility methods:

public class FieldContext {
public final Map<?,?> args;
public final ExecutableTemplate template;
public final int fromLine;

public Class clazz = null;
public Field field = null;

public Object object = null;
public Object value = null;

private Map<String,String> attrs = new HashMap<String,String>();
private Map<String,Boolean> printed = new HashMap<String,Boolean>();

private List<Option> options;
...

Then I have this in another helper class (its info gets added to the FieldContext):

public List<Option> determineOptions(FieldContext context) {
    List<Option> options = new ArrayList<Option>();

    if (context.field.getType().isEnum()) {
        for (Object option : context.field.getType().getEnumConstants()) {
            options.add(new Option(option.toString(), Message.get(option.toString())));
        }
    }

    return options;
}

then the tag declaration is

public static void _selector(Map<?,?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
    String field_name = args.get("arg").toString();
    TagContext.current().data.put("name", field_name);
    SelectHelper helper = HelperFactory.getHelper(SelectHelper.class);

    try {
        FieldContext context = new FieldContext(field_name, args, template, fromLine);
        helper.autoconfigure(context);

        TagContext.current().data.put("selected", helper.determineValue(context));

        out.print("<div class=\"formutil-field formutil-selector\">");
        out.print("<label for=\"" + context.getAttr("id") + "\">");
        out.print(helper.findOrCreateLabel(context));
        out.print("</label>");
        out.print("<select");
        context.printAttribute(out, "id", "name");
        out.print(">");

        if (context.hasOptions()) {
            for (Option option : context.getOptions()) {
                out.print("<option value=\"" + option.value + "\">" + option.label + "</option>");
            }
        }

        out.print("</select>");

        context.printErrorIfPresent(out);
        context.printValidationHints(out);
        out.println("</div>");
    }
    ...
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜