2013-08-21 16 views
1

我已經使用模式擴展爲所有文件夾添加了一個屬性。新屬性稱爲greetingText。每個文件夾在整個鏈A> B> C都可以有greetingText,但是我默認greetingText爲空字符串('')。如果B有greetingText並且當前上下文是對象B,那麼它應該顯示B greetingText。如果文件夾B或C的greetingText爲空字符串,那麼如果對象B是當前上下文,我希望obj.getFields('greetingText')代替給容器文件夾A的greetingText。我知道這是Acquisition的工作原理,但我認爲它只有在文件夾B的greetingText爲None而不是實際值(這是空字符串)的情況下才有效。這是來自連接到控制器頁面模板的Controller Python腳本的上下文。如果當前內容的相同字段爲空,如何從父容器獲取字段值? Plone 4

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 

回答

3

對象的aq_parent屬性可以讓你獲得在父。您可以爬上查找問候語的對象層次結構:

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

這假定您沒有更改該字段的Archetypes訪問器的名稱。

+0

很好的答案,並提示。我沒有說明,對於場景中的文件夾C,它首先檢查文件夾B,如果它沒有它自己的greetingText,但是如果文件夾B沒有greetingText,我想它會像文件夾A一樣遠。文件夾A的級別將始終具有非空值。我相信你的回答只有在直接父母有問候文本但沒有更進一步閱讀祖先線時纔會起作用。我對麼?如果是這樣,是否有任何方法可以產生我想要的行爲?我的道歉,我知道這改變了這個問題。 – user1075722

+0

我試圖循環它,但它把它扔進一個無限循環。 父= context.aq_parent 同時不greetingText: 如果父: 字段= parent.getField( 'greetingText') 如果字段: greetingText = field.getAccessor(上下文)() 父=上下文。 aq_parent – user1075722

+0

我已經重寫了爬上對象樹。讓我知道如果它不起作用! – SteveM

相關問題