Velocity – incluindo diversos arquivos através de um loop

O Chris já publicou aqui um tutorial de Velocity, uma linguagem de templates que estou usando diariamente no trabalho.

Como eu não conhecia a linguagem até começar a trabalhar aqui, existem várias coisas que são são novidades para mim – e os blogs e docmentações estão ajudando a aumentar a produtividade.

Para compartilhar o que aprendi (e servir para minhas consultas futuras), fiz algumas contribuições com posts aqui no O Desenvolvedor, e entre as relacionadas ao Velocity (e Java) destaco duas:

  1. Formatação de datas em Java
  2. Loop no Velocity com limite numérico (foreach)

 

Velocity – Loop de includes usando variáveis

Estava estudando métodos para dar include (parse) em arquivos com o Velocity, e em um caso específico queria incluir diversos arquivos através de um loop: código enxuto, ao invés de adicionar uma linha para cada parse.

Se você não sabe como funciona o parse no Velocity, veja este exemplo de código.

 

 

Para ilustrar este post, criei um "problema" e abaixo explico a solução.

 

Problema
Necessário fazer diversos includes a partir de uma lista de arquivos (string).

Solução
Pegar a lista, transformar em array e usar o parse para cada elemento do array

 

Supondo que você tem a string: "include1,include2,include5" e estes são os nomes de arquivos que você precisa incluir, o primeiro passo é dar um split pelas vírgulas e transformar isso em um array.

 

 

Primeiro setamos uma variável ($inc) com a lista de includes que serão feitos

#set($inc = "include3,include4,include9")

Abaixo utilizo o método split (ler documentação) na variável $inc gerada anteriormente, separado os elementos pela vírgula e criando um array com os nomes dos arquivos (o array poderia ser criado diretamente, porém usei o string para enriquecer mais o exemplo).

#set($arr = $stringUtils.split($inc,","))

Pronto, agora temos um array com o nome dos arquivos e é aqui que a "mágica" começa. Criamos um loop (foreach) para o array, e dentro dele definimos uma variável com o caminho do arquivo que será incluído e chamamos o parse para a variável do caminho ($dir).

#foreach($o in $arr)
   #set($dir = "includes/vm/"+$o+".vm")
   #parse($dir)
#end

 

Tentei concatenar o nome do arquivo (elemento do array) com o caminho direto na linha do parse e não funcionou. O workarround de definir a variável antes resolve o problema!

Espero que seja útil, esse script pode ser bastante útil para o controle de includes!