zope / plone如何评估变量?

时间:2012-07-26 10:45:03

标签: plone zope template-tal zpt

想象一下这种情况:

我在Zope中有一个ZPT,我将其定义为一个金属块,一个全局变量 此变量从类似

的表达式中获取其值
global myVar id | nothing;
global anotherVar 1;

其中nothing可以替换为python:0python:FalseNone,依此类推。

现在想象一下,进入另一个街区,我会做类似

的事情
global myVar2 myVar | anotherVar | nothing;

其中nothing可以是我在上面指定的所有内容。

现在假设id没有值,因此myVarnothing(或其他可能的值;它根本没有区别)。
我期望myVar2获取anotherVar的值,因为anotherVar具有值。但令我惊讶的是,我注意到这不是真的,myVar2myVar值;这意味着nothing

如果我理解发生了什么,我会认为这种陈述只能控制该变量的存在而不是它的值。

显然,我可以将这种声明变成pythonic方式,当然,它的工作“很好”(即,正如我所料) 那么,有人可以证实或反驳我的想法吗?

1 个答案:

答案 0 :(得分:2)

你所要求的不是Plone或Zope特定的,你在这里处理TALES statement,它与TAL和METAL一起形成Zope页面模板实现的页面模板语言(顺便说一句,也是,以及其他几种不同编程语言的实现。)

当您使用|字符时,您正在使用TALES路径表达式,并且它与Python or表达式相同。表达式中命名的每个路径都将被解析,只有如果它不存在将使用下一个路径。从规范:

  

当评估TALES路径表达式时,它会尝试从左到右遍历每个路径,直到它成功或用完路径。

由于您的所有路径都解析为现有变量名称,因此它们都存在,并且将使用第一个路径,而不管它的值是什么。

您想要使用python:表达式:

myVar2 python:myVar or anotherVar or None;

请注意,在TAL中,很少需要global关键字。您可能希望在文档的根元素上定义这些项目;变量在与定义它们的XML或HTML元素相同的范围内可见:

<html tal:define="myVar id | nothing; anotherVar 1;">
  <!-- myVar and anotherVar are visible in the whole HTML document -->
</html>