Pergunta

Eu tenho uma macro tomando vários parâmetros. Algumas delas são opcionais e se um parâmetro for deixado vazio ele irá substituído por padrão.

Agora, a questão é como fazer isto tão fácil quanto possível para web designer comum. Existe algum outro possibity além de meus exemplos para lidar com este caso?

Exemplo 1:

O problema óbvio aqui é os valores opcionais.

#macro (myTag $param1 $param2 $param3)
...
#end

Exemplo 2:

E aqui o problema é um possível problema quando mesma macro é usada mais de uma vez e todas as variáveis ??não estão definidas novamente.

#set ($param1="value1") 
#set ($param2="value2") 
#set ($param3="value3") 

#macro (myTag)
...
#end
Foi útil?

Solução

A partir de Velocity 1.6, parâmetros opcionais ou nomeados não são suportados. Houve um patch recente apresentado com esse recurso para que pudéssemos vê-lo disponível em uma versão futura.

Entretanto, considere passar em uma lista ou um mapa de valores. Por exemplo, você pode passar em um mapa de parâmetros como segue (requer Velocity 1.5 ou superior):

#macro(myMacro $p)
  item 1: $p.param1
  item 2: $p.param2
#end

#set($params = {"param1" : "val1", "param2":"val2"})
#myMacro($params)

exibe:

item 1: val1
item 2: val2

Para lidar com parâmetros opcionais, use um # if dentro do macro para verificar se o parâmetro. A adição de novos elementos para o mapa é um pouco confuso. Como o método Java "colocar" retorna um valor, você tem que usar #set de dispor do valor de retorno. (Caso contrário, ele é exibido no texto resultante).

#macro(myMacro $p)
  #if(!$p.param1)#set($dummy = $p.put("param1", "default1"))#end
  #if(!$p.param2)#set($dummy = $p.put("param2", "default2"))#end
  #if(!$p.param3)#set($dummy = $p.put("param3", "default3"))#end

  item 1: $p.param1
  item 2: $p.param2
  item 3: $p.param3
#end

#set($params = {"param1" : "val1", "param2":"val2"})
#myMacro($params)

exibe

item 1: val1
item 2: val2
item 3: default3
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top