2011/05/14

Related Items and ReferenceField

預設的 ATContentType 提供 relatedItems 欄位,可以用來建立或指定關連項目,想在程式裡指定的話,可以參考下列的資訊:

>>> app.mysite['front-page'].setRelatedItems(app.mysite.news)
>>> app.mysite['front-page'].getRelatedItems() [<ATFolder at /mysite/news>]

setRelatedItems() 每次只接一個參數,因此後來接的參數,原則上就是蓋掉之前的設定值。想要清空內容的話,就是使用 setRelatedItems(''),想要指定多值,或是加入新值的話,可用串列的技巧:

>>> app.mysite['front-page'].setRelatedItems
  ([app.mysite.news,app.mysite.events])

還有個 getRawRelatedItems() 可以傳回 UID:

>>> app.mysite['front-page'].getRawRelatedItems()
['f8a2a96821f6e3df8dafd19d16b68fb2', '04b2e1267906691beccdff58dd861176']

可以試試 getRelatedItems() + UID() 是否跟 getRawRelatedItems() 結果是否相同。另外,在plone.app.layout/viewlets/content.py 裡的 ContentRelatedItems 程式碼片段,示範如何存取及顯示:

class ContentRelatedItems(ViewletBase):
    index = ViewPageTemplateFile("document_relateditems.pt")

    def related_items(self):
        context = aq_inner(self.context)
        res = ()
        if base_hasattr(context, 'getRawRelatedItems'):
            catalog = getToolByName(context, 'portal_catalog')
            related = context.getRawRelatedItems()
            if not related:
                return ()
            brains = catalog(UID=related)
            res = list(brains)
        return res

No comments: