Solución:
Si está usando freemarker 2.3.23 o más reciente, puede usar el then
incorporado:
<a href="https://foroayuda.es/${a?then("a.htm','b.html')}" target="${openTarget}">
Si está utilizando una versión anterior de freemarker, puede utilizar en su lugar el string
incorporado:
<a href="https://foroayuda.es/${a?string("a.htm','b.html')}" target="${openTarget}">
Cuando se aplica a un booleano, el string
incorporado actuará como un operador ternario.
Esta macro proporciona una forma más sencilla de realizar operaciones ternarias:
<#macro if if then else=""><#if if>${then}<#else>${else}</#if></#macro>
Es fácil de usar, se ve bien y es bastante legible:
<@if someBoolean "yes" "no"/>
Tenga en cuenta que es @if
– y no #if
como en la directiva incorporada. A continuación se muestran algunos ejemplos más.
<!-- `else` is optional -->
<@if someBoolean "someBoolean is true"/>
<!-- expressions -->
<@if (someBoolean||otherBoolean) "hello,"+user.name 1+2+3 />
<!-- with parameter names -->
<@if someBoolean then="yes" else="no" />
<!-- first in list? -->
<#list seq as x>
<@if (x_index==0) "first" "not first"/>
<#list>
Por alguna razón, no puede agregar paréntesis alrededor de parámetros sin nombre, si son expresiones no booleanas. Eso podría haber aumentado aún más la legibilidad.
Puede definir una función personalizada if
que se declara así:
<#function if cond then else="">
<#if cond>
<#return then>
<#else>
<#return else>
</#if>
</#function>
La función se puede utilizar en cualquier ${...}
expresión. Tu código se vería así:
<a href="https://foroayuda.es/${if(a,"a.htm', 'b.htm')}">
A diferencia de @kapep, creo que deberías usar una función, no una macro. Las macros producen una salida (textual), mientras que las funciones devuelven un valor que, por ejemplo, se puede asignar a una variable, pero también se puede escribir en la salida, por lo que el uso de una función es más flexible. Además, la forma de aplicar la función está mucho más cerca de usar un operador ternario, que también se usaría dentro ${...}
expresiones, no como una directiva.
Por ejemplo, si necesita el destino del enlace condicional varias veces, tendría sentido asignarlo a una variable local:
<#assign targetUrl=if(a, 'a.htm', 'b.htm')/>
<a href="https://foroayuda.es/${targetUrl}">link 1</a>
...
<a href="https://foroayuda.es/${targetUrl}">link 2</a>
Usando la función en lugar de la macro, los ejemplos de @ kapep se verían así:
<!-- `else` is optional -->
${if(someBoolean, "someBoolean is true")}
<!-- expressions -->
${if(someBoolean||otherBoolean, "hello,"+user.name, 1+2+3)}
<!-- with parameter names: not possible with functions,
but also not really helpful -->
<!-- first in list? -->
<#list seq as x>
${if(x_index==0, "first", "not first")}
<#list>