Существует два способа создания пользовательских тегов в игровой среде.
- Определив отличный шаблон в app/view/tags
- Непосредственно в чистой Java, имея класс, расширяющий FastTags
Последнее НЕ задокументировано.
Существует два способа создания пользовательских тегов в игровой среде.
Последнее НЕ задокументировано.
Таким образом, аналогично тому, как работают JavaExtensions, расширяя класс JavaExtensions, для создания FastTag необходимо создать класс, который расширяет FastTags. Каждый метод, который вы хотите выполнить как тег, должен соответствовать следующей структуре метода.
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));
}
Таким образом, этот первый метод является тегом verbatim и просто вызывает метод toString для JavaExtensions и передает тело тега. Тело тега может быть чем угодно между открытым и закрытым тегом. Так
<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 на уровне класса.
Итак, для тега hello в пространстве имен 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/}