Может кто-нибудь объяснить, как использовать FastTags

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

  1. Определив отличный шаблон в app/view/tags
  2. Непосредственно в чистой Java, имея класс, расширяющий FastTags

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


person Olivier Refalo    schedule 09.11.2010    source источник


Ответы (1)


Таким образом, аналогично тому, как работают 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/}
person Codemwnci    schedule 09.11.2010
comment
Очень хорошо, в качестве дополнения вы могли бы объяснить аннотацию класса @FastTags.Namespace(mytags), что было бы хорошей практикой для предотвращения конфликтов имен. - person niels; 09.11.2010
comment
Спасибо! не могли бы вы дать подробную информацию о возникновении ошибок из тега? скажем, отсутствует входной параметр... как мне сгенерировать ошибку/исключение? - person Olivier Refalo; 10.11.2010
comment
Взгляните на строку 147 в ссылке на github, которую я разместил. Он показывает пример использования templateexecutionexception в случае, аналогичном тому, что вы указали. - person Codemwnci; 10.11.2010
comment
получил, спасибо, для справки: выбросить новое TemplateExecutionException (template.template, fromLine, пожалуйста, укажите ключ ошибки, новое TagInternalException (пожалуйста, укажите ключ ошибки)); - person Olivier Refalo; 10.11.2010
comment
очень четкое объяснение, я думаю, что это должно идти прямо играть! документация - person opensas; 10.11.2010
comment
Добавлен билет, чтобы добавить это в официальную документацию play.lighthouseapp.com/projects /57987-play-framework/tickets/ - person niels; 10.11.2010
comment
На самом деле, есть проблема с вызовом исключения выше, template.template не виден, это пользовательский pkg. Я открыл тикет play.lighthouseapp.com/projects/57987/tickets/ - person Olivier Refalo; 10.11.2010