lunes, 16 de julio de 2012

Programación modular en Grails - TagLib

Si lo que necesitamos es reutilizar código, Grails nos lo facilita con los TagLibs (Librerias de etiquetas)
Por ejemplo: si lo que se quiere es crear un TexBox con unas caracteristicas determinadas el cual usar en muchas vistas podemos crear un taglib el cual lo defina; de esta manera si se realizan modificaciones solo habrá que realizarlas en un solo sitio.

Crear TagLib
Botón derecho sobre la carpeta Tag Libraries -> New -> Grails Tag Library...  proporcionamos un nombre ej. Controls y esto generará un archivo ControlsTagLib.groovy ahora solo hay que añadir el código del TexBox


class ControlsTagLib {
static namespace = 'controls' 
   /**
       * - size: Para forzar un ancho (HTML) concreto
       * - id: el id del <input>
       * - value: el valor que tedrá el <input>
       * - click: código javascript que se ejecutará al hacer click
      */
     def textBox = { attrs ->
         def size = getOptionalAttribute(attrs, "size")
         def id = getOptionalAttribute(attrs, "id")
         def value = getOptionalAttribute(attrs, "value")
         def click = getOptionalAttribute(attrs, "click")
         def className = getOptionalAttribute(attrs, "class")
         // Otros Atributos
         def extraAttrs = ""
         attrs.each{k,v ->
              extraAttrs += "${k}=\"${v.encodeAsHTML()}\" "
        }

     out << """
            <input onclick=\"selectTextInput('${id}'); ${click}\" id=\"${id}\" type=\"text\" size=\"${size ? size : "10"}\" value=\"${value}\" class=\"elemsFilterForm ${className}\"  ${extraAttrs}>
     """
     }

     protected getRequiredAttribute(attrs, String name, String tagName) {
         if (!attrs.containsKey(name)) {
    throwTagError("Tag [$tagName] is missing required attribute [$name]")
        }
        attrs.remove name
     }

     protected getOptionalAttribute(attrs, String name) {
         def ret = attrs.remove(name)
         if(!ret || ret.equals("")){
       ret = ""
        }
        return ret
     }
}

Para utilizar el taglib desde una vista

<controls:textBox id="username" name="username"  value="${userInstance.username}" size="20"/>

No hay comentarios:

Publicar un comentario