如何获得#evaluate并将其结果放入页面范围?

时间:2019-04-08 20:01:14

标签: velocity confluence

我无法使用在Confluence中使用Velocity将JSON字符串转换为映射所见过的任何可接受的解决方案,来#evaluate设置变量。

我有另一个系统用来生成动态数据的JSON字符串。在开发过程中,我可以直接使用地图:

#set($textMapRaw = [{"ace":"clubs"}])

$textMapRaw.get(0).ace

最后一行呈现为“ clubs”。

我曾期望使用#evaluate将实时数据转换为对象数组。但是,当我对它执行任何操作时,似乎#evaluate并未将声明的变量放回范围内。这是作为字符串输入的同一张地图:

#set($textMapHtml = '[{"ace":"clubs"}]')
#set($evalHtml = '#set($myMapHtml = '+ $textMapHtml +')')
evalHtml = $evalHtml<br/>
#evaluate($evalHtml)

$myMapHtml.get(0).ace

最后一行呈现为“ $ myMapHtml.get(0).ace”。

我知道$ myMapHtml正在评估中,因为当我没有在其末尾附加Html以避免Confluence自动转义的恶作剧时,我得到了一个评估堆栈跟踪。

我已经尝试过使用$ {hash} set转义set中的哈希。我试过单引号和双引号。我已经尝试过通过评估设置字符串:

#evaluate('#set($dippity = "doo")')
$dippity

#set($hash = '#')
#evaluate("${hash}set($blue = 'moon')")
$blue

无论我如何处理任何已批准的#evaluate代码,它都不会在Confluence中进行评估。我总是得到与未定义变量相同的结果。

注意:在我们的环境中,我无法使用Java进行变通并将其推入模板。我需要找到一个纯的模板内解决方案。

2 个答案:

答案 0 :(得分:1)

Velocity 1.6.4不允许在=MID(Fields!Field.Value, InStr(Fields!Field.Value, ">") + 1, InStrRev(Fields!Field.Value, "</") -Len(Left(Fields!Field.Value, InStr(Fields!Field.Value, ">") + 1))) 指令中修改评估上下文。因此,使用此版本时,无法使用动态名称创建上下文条目。

但是,您可以做的是将它们存储在地图中:

#evaluate

答案 1 :(得分:0)

由于似乎您无法将变量恢复到当前范围,所以我想出了一种解决方法。只需使用评估将数组/映射传递给宏。

如果尝试在所评估的代码或其调用的宏之外操作变量,仍然会遇到范围问题,但是如果您小心一点,可以围绕它进行编码。

就我而言,我在宏内移动了另一段代码,以利用本地范围确定要处理的项目数量。

#macro(processMap $theMap)
  #set($count = 0)
  #foreach($item in $theMap)
    #set($count = $velocityCount)
    <p>This thing is $item.tweedle</p>
  #end
  <p><b>I did that $count times</b></p>
#end

#set($workaroundHtml = '[{"tweedle":"dee"},{"tweedle":"dum"}]')

#set($eval = '#processMap(' + $workaroundHtml + ')')

#evaluate($eval)