[在XWiki网站内部,我大量使用速度模板来具有特定的对象表示形式。在一个特定的模板中,我需要能够具有一个间接级别,以允许对某些字段进行特殊处理。我设法将公式放入变量中,并在渲染时对其求值。
我当前的(简体)代码是:
#set($special = { 'field1': 'F1: $pageDoc.display("field1") - F2: $pageDoc.display("field2")',
'field2': '' }
...
#foreach($field in $fields):
#if($special.contains($field))
#if("$special[$field]" != "")
<p>#evaluate($special[$field])</p>
#end
#else
<p>$pageDoc.display($field)</p>
#end
#end
实际上,此示例代码一行显示一个字段列表,而其中某些字段(special字段)则显示为一行2($pageDoc.display($field)
是XWiki惯用语,用于显示获取可显示值来自页面中包含的对象)
对于其他渲染引擎,我现在需要将行传递给引擎:
$engine.addLine($pageDoc.display($field))
但是$engine.addLine(#evaluate($special[$field]))
无法工作,因为#evaluate
直接输出其求值并且不返回任何内容。
是否有速度将#evaluate
的结果存储在变量中?
在速度上,#evaluate
仅执行其内容。观察到所有副作用,主要是输出,但是什么也不能返回。
技巧的(第一部分)是让#evaluate
评估#set
,例如(请注意,这是不正确的:]
#evaluate(#set($resul = $special[$field]))
$engine.addLine($resul)
如果在评估的字符串中要转义特殊字符,因为第一部分将不被评估,而第二部分应被评估,并且速度具有相当奇怪的转义规则,则该问题:#
和$
应被转义使用\
,而'
和"
应加倍...
关于第二部分,它仅给出:
#evaluate("\#set(\$resul= ""$special[$field]"")")
$engine.addLine($resul)