イベントハンドラは、Ploneの開発でも役に立ちます。

イベントハンドラは、デスクトップアプリなどでは、よく使っています。このイベントハンドラですが、Plone 3 から利用できるようになっていて、とても便利です。ただ、zcmlに書いたりとしてめんどくさいのも事実です。しかし、Five.grokを使うことでこの面倒なことがなくなり、非常に使いやすくなりました。

何が便利かといえば、例えば、あるコンテンツを生成したとき、同時に、作成したオブジェクトの中にコンテンツを作成したい時などです。(Archtypesを使えば、initialized_archtypes()メソッドで実現できますが。)

この場合は、コンテンツを生成してコンテナに登録されたとき、追加されたことを知らせる、IObjectAddedEventが発生するので、このイベントを使って、コンテンツを追加する操作を行います。

下記のコードは、IAobjインターフェイスを持ったAobjがあり、Aobjが追加された時に、idを「b」としてBobjを追加する方法です。サンプルのコンテンツは、Dexterity FTIを使っていることとします。

from five import grok
from zope.app.container.interfaces import IObjectAddedEvent
from plone.dexterity.utils import createObject

・・・中略・・・

@grok.subscribe(IAobj, IObjectAddedEvent)
def addedAobj(aobj, event):
    bobj = createObject('Bobj', title=u'B')
    aobj['b']= bobj

なお、イベントハンドラは、追加のほかに、編集が終了した時に発生するIObjectModifiedEventや、削除されたときに発生するイベントIObjectRemovedEventなどがあります。