2011-04-21 37 views
4

我想呈現一個對象的視圖來代替另一個對象,但保持規範路徑爲最初遍歷的路徑,所以麪包屑和對象選項卡等仍然是相同的。替換Plone中的規範對象

我知道如何渲染其他對象來代替規範的對象,但幾乎看起來似乎不可能覆蓋規範對象的用途,除非我可能重寫「plone_context_state」瀏覽器視圖中的「canonical_object」方法。

這裏是我有我的看法呼籲渲染另一個對象方法的代碼:

item = aq_base(default_item).__of__(self.context) 
layout = item.getLayout() or item.getDefaultLayout() 
try: 
    return aq_acquire(item, layout)(*args, **kwargs) 
except AttributeError: 
    try: 
     return getMultiAdapter((item, self.request), name=layout)(*args, **kwargs) 
    except: pass 

return super(DefaultItemEnabledView, self).__call__(*args, **kwargs) 

現在,是有可能使通過Plone中使用的規範對象原來走過一個這樣的麪包屑,對象標籤等是否適用?

+0

除了條款你的空白導致ZODB衝突錯誤的情況下問題;他們會被吞噬,很多奇怪的事情會隨之而來。 – 2011-04-21 10:13:26

+0

hhmm,好吧,在渲染視圖時不應該寫入數據庫,以免發生這種情況。或者我錯了? – vangheem 2011-04-21 13:17:00

+0

你不能假設所有的代碼都會表現出來,而不會導致寫入。 ;-)底線:Zope中的除毛毯外幾乎都會咬你。 – 2011-04-21 13:56:03

回答

3

恐怕你想要的是不可能完成的任務;你正在渲染一個新的上下文的全部chrome,並且所有的東西都會使用該上下文進行渲染。你必須重做一切;麪包屑,動作,portlet,任何其他上下文相關的viewlets。

我不確定你的用例是什麼,你必須支持任意對象的所有可能的佈局,你可能不得不重新考慮你的選擇。

如果您沒有需要所有可能的佈局的用例,那麼您可以爲您的規範化對象創建自定義視圖,以便爲其他對象重新渲染內容。例如,許多內容視圖已經包含了可以重新使用的宏。請看skins/plone_content/folder_full_view_item.pt以獲取示例模板,該模板可重用此類宏以呈現folder_full_view模板的文件夾中的項目。

+0

這絕對是更好的方法。感謝您的建議。 – vangheem 2011-04-21 13:17:39

1

bda.contentproxy是一個產品,使這一點,但注意 ...是一個非常複雜的任務,充分的角落背後的問題