Por lo tanto, de forma similar a como funciona JavaExtensions extendiendo la clase JavaExtensions, para crear un FastTag necesita crear una clase que amplíe FastTags. Cada método que desee ejecutar como una etiqueta debe ajustarse a la siguiente estructura de método.
public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)
Nota del subrayado antes del nombre de la etiqueta.
Para comprender cómo crear una etiqueta real, la manera más fácil es mirar el código fuente de una FastTag y ver una en acción.
Aquí está la fuente directamente desde git hub. https://github.com/playframework/play/blob/master/framework/src/play/templates/FastTags.java
A continuación se muestran algunas que he copiado, para poder explicar cómo funcionan.
public static void _verbatim(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
out.println(JavaExtensions.toString(body));
}
Así, este primer método es la etiqueta textualmente, y simplemente llama al método toString en los JavaExtensions, y pasa en el cuerpo de la etiqueta. El cuerpo de la etiqueta sería cualquier cosa entre la etiqueta abrir y cerrar. Así
<verbatim>My verbatim</verbatim>
El valor cuerpo sería
My verbatim
El segundo ejemplo, es un poco más compleja. Es una etiqueta que depende de una etiqueta principal para funcionar.
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>");
}
Este código funciona mediante la emisión de una etiqueta de opción HTML, y establece el valor seleccionado, mediante la comprobación de qué valor se selecciona del código padre. Las primeras 3 líneas solo obtienen datos y configuran los datos listos para la salida. Luego, las 3 líneas finales generan el resultado de la etiqueta.
Hay muchos más ejemplos en el código fuente al que me he vinculado, con diversos grados de complejidad, pero espero que este sea un buen punto de partida para usted.
Para asegurarse de que sus etiquetas no entren en conflicto entre proyectos, o con las etiquetas básicas de Play, puede configurar espacios de nombres, utilizando la anotación de nivel de clase @ FastTags.Namespace.
Así, para una etiqueta hola, en un espacio de nombres de my.tags, que haría la siguiente
@FastTags.Namespace("my.tags")
public class MyFastTag extends FastTags {
public static void _hello (Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
...
}
}
y luego en sus plantillas, que haría referencia a la etiqueta hola como
#{my.tags.hello/}
Muy bueno, como complemento podrías explicar la anotación de clase @FastTags.Namespace ("mytags"), que sería una buena práctica para evitar colisiones de nombres. – niels
Buen punto, lo agregaré ahora. – Codemwnci
¡Gracias! ¿Podría dar detalles sobre cómo generar errores de una etiqueta? dicen que falta un parámetro de entrada ... ¿cómo puedo generar un error/excepción? –