2012-07-26 41 views
3

我想以編程方式進行一些註冊,這些註冊取決於存儲在plone.app.registry中的數據。具體而言,我想將menuItems添加到通常通過zcml完成的對象的顯示菜單中。如何在啓動時初始加載plone站點時訂閱

這種「plone loaded」事件的「標準」方法是什麼?

途徑,我認爲是:

  • 使用站點根目錄遍歷前鉤,使註冊,然後設置某種標記,以防止重新註冊
  • 傾聽一個Zope啓動事件(如zope.processlifetime.IProcessStarting),然後找到在ZODB所有的Plone站點並進行註冊

回答

3

我會使用一個事件處理程序掛接到現場穿越,具有一個切換:

_menuItemsRegistered = set() 

def beforeSiteTraverse(site, event, _handled=set()): 
    if site.getPhysicalPath() not in _handled: 
     registerMenuItems(site) 
     __handled.add(site.getPhysicalPath()) 

現在registerMenuItems將只對每個Plone站點執行一次,而且執行起來非常便宜。

如果您只需要爲每個實例處理一個Plone網站,您可以減少這個(更多)第一次開火後取消訂閱您的處理程序。

這工作比處理一個IProcessStarting事件作爲,那麼你就必須成立本地註冊(調用setSite)對每一個Plone站點之前,你甚至可以訪問註冊表工具更好。

+0

感謝您的回答。我也意識到,我需要處理註冊表中的設置在運行時更改的情況,那麼menuItems也需要更改。我說的像menuItem這樣的註冊是每個線程嗎?在這種情況下,我不知何故需要在每個線程上重新安裝我的menuItems。所以我認爲beforeSiteTraverse需要查看數據庫中的時間戳或散列,以確定menuItems是否仍然有效。這是否會執行?有沒有更好的方法來做到這一點? – djay 2012-07-27 01:15:07

+0

聽起來像你需要重新考慮這整個設置,並使用動態菜單?在任何情況下,組件註冊都不是每個線程,儘管它們可能會被每個線程緩存。並且持久保存本地組件註冊表,然後應用通常的落實邊界和每個線程對象實例緩存。 – 2012-07-27 08:03:29

相關問題