Plone 如果当前内容';同一字段是否为空?普隆4号

Plone 如果当前内容';同一字段是否为空?普隆4号,plone,zope,Plone,Zope,我使用模式扩展为所有文件夹添加了一个属性。新属性称为greetingText。每个文件夹可以在整个链A>B>C中包含greetingText,但是我将greetingText默认为空字符串(“”)。如果B有一个greetingText,并且当前上下文是对象B的,那么它应该显示B greetingText。如果文件夹B或C的greetingText为空字符串,那么如果对象B是当前上下文,我希望obj.getFields('greetingText')为容器文件夹A提供greetingText。我知

我使用模式扩展为所有文件夹添加了一个属性。新属性称为greetingText。每个文件夹可以在整个链A>B>C中包含greetingText,但是我将greetingText默认为空字符串(“”)。如果B有一个greetingText,并且当前上下文是对象B的,那么它应该显示B greetingText。如果文件夹B或C的greetingText为空字符串,那么如果对象B是当前上下文,我希望obj.getFields('greetingText')为容器文件夹A提供greetingText。我知道这就是采集的工作原理,但我认为只有当文件夹B的greetingText为None而非实际值(即空字符串)时,它才会以这种方式工作。这来自连接到控制器页面模板的控制器Python脚本的上下文

from Products.CMFPlone import PloneMessageFactory as _
from Products.CMFCore.utils import getToolByName

plone_utils = getToolByName(context, 'plone_utils')
plone_log=context.plone_log

req = context.REQUEST
res = req.RESPONSE

greeting = context.getField('greetingText').getAccessor(context)()

msg = "id= %s"%(greeting)

res.write(msg)

return

对象的aq_parent属性允许您访问父对象。您可以爬升对象层次以查找问候语:

greeting = ''
while context is not None:
    accessor = getattr(context, 'getGreetingText')
    if accessor:
        greeting = accessor()
        if greeting:
            break
    context = context.aq_parent

这假设您没有更改字段的原型访问器的名称。

回答得很好,并提示您。我没有澄清,对于场景中的文件夹C,如果文件夹B没有自己的问候语文本,它会首先检查文件夹B,但如果文件夹B没有问候语文本,我希望它一直上到文件夹A。文件夹A的级别将始终具有非空值。我相信,你的回答只有在直系父母有问候语的情况下才会起作用,但不能进一步阅读祖先的话。我说得对吗?如果是这样的话,你知道有什么方法可以产生我想要的行为吗?据我所知,我的道歉改变了问题。我试图循环它,但这使它陷入无限循环。parent=context.aq_parent而不是greetingText:if parent:field=parent.getField('greetingText')if field:greetingText=field.getAccessor(context)()parent=context.aq_parent我已重写以爬升对象树。如果不行就告诉我!