3

plone.app.registryに保存されているデータに依存するいくつかの登録をプログラムで行いたいと思っています。具体的には、オブジェクトの表示メニューにmenuItemsを追加したいと思います。これは通常、zcmlを介して行われます。

このような「ploneloaded」イベントへの「標準」アプローチとは何ですか?

私が検討したアプローチは次のとおりです。

  • サイトルートでプレトラバーサルフックを使用し、登録を行ってから、再登録を防ぐために何らかの種類のマーカーを設定します
  • zopeスタートアップイベント(zope.processlifetime.IProcessStartingなど)をリッスンしてから、ZODB内のすべてのPloneサイトを見つけて登録を実行します
4

1 に答える 1

3

イベントハンドラーを使用して、トグルを使用してサイトトラバーサルにフックします。

_menuItemsRegistered = set()

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

registerMenuItemsこれで、Ploneサイトごとに1回だけ実行され、実行するのが非常に安価になります。

インスタンスごとに1つのPloneサイトのみを処理する必要がある場合は、これを(さらに)減らすことができます。初回起動後にハンドラーのサブスクライブを解除するだけです。

レジストリユーティリティにアクセスする前に、すべてのPloneサイトにIProcessStartingローカルレジストリ(call)を設定する必要があるため、これはイベントを処理するよりもうまく機能します。setSite

于 2012-07-26T09:50:20.187 に答える