Может кто-нибудь объяснить, как использовать FastTags - PullRequest
25 голосов
/ 09 ноября 2010

Существует два способа создания таможенных тегов с помощью игровой среды.

  1. Определяя шаблон groovy в приложении / view / tags
  2. Непосредственно в чистом Java с расширением класса FastTags

Последнее НЕ задокументировано.

1 Ответ

23 голосов
/ 09 ноября 2010

Итак, аналогично тому, как работают JavaExtensions, расширяя класс JavaExtensions, для создания FastTag вам нужно создать класс, расширяющий FastTag.Каждый метод, который вы хотите выполнить как тег, должен соответствовать следующей структуре метода:

public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)

Обратите внимание на подчеркивание перед именем тега.

Чтобы понять, как создать реальный тег, проще всего взглянуть на исходный код FastTag и увидеть его в действии.

Вот источник прямо из git hub.https://github.com/playframework/play/blob/master/framework/src/play/templates/FastTags.java

Ниже приведены некоторые из них, которые я скопировал, чтобы я мог объяснить, как это работает.

public static void _verbatim(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
    out.println(JavaExtensions.toString(body));
}

Итак, этот первый метод - тег дословно и просто вызывает метод toString для JavaExtensions и передает тело тега.Тело тега будет чем-то между тегами open и close.Итак,

<verbatim>My verbatim</verbatim>

Значение тела будет равно

My verbatim

Второй пример немного сложнее.Это тег, который опирается на родительский тег для функционирования.

public static void _option(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
    Object value = args.get("arg");
    Object selectedValue = TagContext.parent("select").data.get("selected");
    boolean selected = selectedValue != null && value != null && selectedValue.equals(value);
    out.print("<option value=\"" + (value == null ? "" : value) + "\" " + (selected ? "selected=\"selected\"" : "") + "" + serialize(args, "selected", "value") + ">");
    out.println(JavaExtensions.toString(body));
    out.print("</option>");
}

Этот код работает путем вывода тега HTML-опции и устанавливает выбранное значение, проверяя, какое значение выбрано из родительского тега.Первые 3 строки просто получают данные и устанавливают данные, готовые к выводу.Затем последние 3 строки выводят результат тега.

В исходном коде есть еще много примеров с различной степенью сложности, но, надеюсь, это станет хорошей отправной точкой для вас..

Чтобы ваши теги не конфликтовали между проектами или с основными тегами Play, вы можете настроить пространства имен, используя аннотацию уровня класса @ FastTags.Namespace.

Итак, дляПривет тег, в пространстве имен my.tags, вы должны сделать следующее

@FastTags.Namespace("my.tags") 
public class MyFastTag extends FastTags {
    public static void _hello (Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
        ...
    }
}

, а затем в ваших шаблонах вы бы ссылались на тег приветствия как

#{my.tags.hello/}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...