イベントハンドラは、デスクトップアプリなどでは、よく使っています。このイベントハンドラですが、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などがあります。