Validar tipos de datos en variables de Blogger

Las variables de la etiqueta b:skin, además de su uso para diseño de la plantilla, también pueden almacenar datos que se pueden recuperar en el código. Sin embargo, es muy fácil romper la plantilla cuando se usan en expresiones. En este artículo te muestro como validar tipos de datos para evitar errores.

Situación

Supongamos que queremos guardar un valor para realizar alguna operación más adelante. Para ello podemos usar las variables tipo Skin String de Blogger. Estas variables no requieren el atributo default y tampoco son visibles en el diseñador de plantillas por lo que son perfectas para este trabajo:

<!-- Definicion de la variable -->
<Variable name="number" description="Número" type="string" value="4"/>

<!-- Expresion con la variable -->
<b:eval expr='data:skin.vars.number * 5'/>

En este caso hemos almacenado el valor numérico 4 para recuperarlo en una operación matemática donde el resultado será 20. Ademas como resultado de la operación la variable se convierte en un dato tipo number. El problema surge cuando se ingresa otro valor que no sea un número:

<!-- Definicion de la variable -->
<Variable name="number" description="Número" type="string" value="Hola mundo"/>

<!-- Expresion con la variable -->
<b:eval expr='data:skin.vars.number * 5'/>

Debido a que nuestra expresion matemática espera un valor numérico, la plantilla se rompe mostrando un error crítico al visitar el blog del tipo "Invalid expression". Para evitar esto, es necesario validar el tipo de dato antes de realizar la operación.

Validar tipo number

Para obtener siempre un valor numérico, podemos usar una expresion condicional con el operador + que se puede usar tanto con cadenas de caracteres como con números:

<b:with value='data:skin.vars.number' var='n'>
<b:with value='data:n + 0 == data:n ? (data:n * 1) : 1' var='number'>
  <b:eval expr='data:number * 20'/>
</b:with>
</b:with>

Lo que hace nuestra expresion es sumar 0 al valor de la variable number, si el resultado es igual al valor original, entonces se trata de un número y lo multiplicamos por 1 para convertirlo. Caso contrario, devolvemos un valor numérico por defecto. De esta forma la expresión siempre será correcta y la plantilla no se romperá.

Validar tipo String

Las variables tipo Skin String no pueden acceder a los parámetros de un dato tipo string, como por ejemplo length, escaped, etc. Aunque esto no es un problema, es una de las razones por lo que tal vez necesites realizar la conversión. Para ello podemos usar nuevamente el operador + en una expresión:

<b:with value='data:skin.vars.string + "."' var='string'>
  <b:eval expr='data:string contains "t"'/>
</b:with>

En este caso, sea cual sea el valor de la variable string, se le concatenará un caracter (he elejido el . pero puede ser cualquiera, incluso un espacio en blanco). De esta forma el resultado siempre será una cadena de caracteres y en expresiones donde se requiera un valor de tipo string obligatorio (en este ejemplo el operador contains), el tema no se romperá.

Validar tipo Boolean

Para validar un valor booleano, solo vamos a necesitar cualquier operador o etiqueta que devuelva un valor booleano. Es probablemente el tipo de dato mas sencillo de validar:

<b:eval expr='data:skin.vars.boolean ? "Si" : "No"'/>

En este caso, el usuario puede ingresar cualquier valor en la variable boolean y en consecuencia obtendra un booleano evaluado como verdadero. Solo si se ingresa especificamente false, no o se deja el valor en blanco, el resultado será false.

Conclusión

Validar los tipos de datos en las variables de Blogger es una buena práctica para evitar errores en el diseño de la plantilla, sobre todo si el diseño está destinado a otros usuarios. Al realizar validaciones sencillas nos aseguraramos de que los datos sean del tipo correcto.

Como siempre, podrás encontrar adjunto en este articulo una plantilla de ejemplo para que puedas comprender mejor todo lo explicado. Si tienes alguna duda o sugerencia, no dudes en dejar un comentario. Responderé lo antes posible. Muchas gracias por leerme.