Как продлить игру!Теги шаблонов фреймворка - PullRequest
1 голос
/ 01 февраля 2012

Я бы хотел расширить встроенный тег шаблона #{a. Например, вместо того, чтобы писать каждый раз:

#{a @Controller.Action(parameter.slugify()) /}

Где, если parameter="This Is a Test", то сгенерированный href равен http://localhost/controller/action/this-is-a-test

Я бы хотел расширить его так, чтобы параметр всегда был слагифицирован по умолчанию, без явного выполнения с .slugify().

Спасибо

1 Ответ

3 голосов
/ 01 февраля 2012

Что вы хотите сделать, это определить свои собственные быстрые теги. Вот хороший пример здесь . Проверьте этот ответ как хорошо .

Код, вероятно, будет выглядеть так:

@FastTags.Namespace("mytags")
public class MyTags extends play.templates.FastTags{


    public static void _a(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
        ActionDefinition actionDef = (ActionDefinition) args.get("arg");
        if (actionDef == null) {
            actionDef = (ActionDefinition) args.get("action");
        }
        if (!("GET".equals(actionDef.method))) {
            if (!("POST".equals(actionDef.method))) {
                String separator = actionDef.url.indexOf('?') != -1 ? "&" : "?";
                actionDef.url += separator + "x-http-method-override=" + actionDef.method;
                actionDef.method = "POST";
            }
            String id = Codec.UUID();
            out.print("<form method=\"POST\" id=\"" + id + "\" " +(args.containsKey("target") ? "target=\"" + args.get("target") + "\"" : "")+ " style=\"display:none\" action=\"" + actionDef.url + "\">");
            _authenticityToken(args, body, out, template, fromLine);
            out.print("</form>");
            out.print("<a href=\"javascript:document.getElementById('" + id + "').submit();\" " + serialize(args, "href") + ">");
            out.print(JavaExtensions.toString(body));
            out.print("</a>");
        } else {
            out.print("<a href=\"" + actionDef.url + "\" " + JavaExtensions.slugify(serialize(args, "href")) + ">");
            out.print(JavaExtensions.toString(body));
            out.print("</a>");
        }
    }
}

и назовитесь так в вашем шаблоне:

#{mytags.a @Controller.Action(parameter) /}
...