2012/04/07

Archetypes ReferenceField and Bidirectional References

Archetypes 的 ReferenceField 搭配 ReferenceBrowserWidget 可以選取參照項目,不過問題之一,是重複的有序項目只能被選擇一次。後來想出一個變通方法,是建立一組內容型別,第一個內容型別具備目錄屬性,用來包含另一個內容型別,花點工夫改善顯示方式就行。

接著按照範例,透過 reference_catalog 的 getBackReferences() 可以顯示 bidirectional reference 的結果,不過,除了直接記錄 reference 資訊的項目外,我們也想顯示上一層的資訊。

之前的討論裡提到,如果物件是繼承 Acquisition.Implicit 或 Acquisition.Explicit 而來,稱之為 Acquisition aware,它們就能使用 context.aq_parent 或 context.aq_inner 功能,除此之外的物件,要用下列的方法才行:

from Acquisition import aq_inner, aq_parent 
parent = aq_parent(aq_inner(context))

在 Products.ATContentTypes/skins/ATContentTypes/unittestGetTitleOf.py 看得到四種範例:

## Script (Python) "unittestGetTitleOf"
##title=Helper method for function tests
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=

return "%s,%s,%s,%s" % (
    context.title_or_id(),
    context.aq_parent.title_or_id(),
    context.aq_inner.title_or_id(),
    context.aq_inner.aq_parent.title_or_id())

No comments: