2011-07-06 4 views
2

ユーザがリソース(カスタムコンテンツタイプ)にアクセスしようとしたときにトリガされるサブスクライバを作成したいとします。したがって、オブジェクトは追加されず、変更されず、何もトラバースされません。 Zope View Eventのようなものです。Plone上のブラウザにページが表示される直前に、どのイベントを使用してサブスクライバをトリガする必要がありますか?

基本的に、カスタムコンテンツタイプにカスタムワークフロー(2つの状態:privateviewed)があるとします。初期状態はprivateです。このコンテンツタイプは、匿名ユーザーが_createObjectByTypeを使用して、プログラムによってのみ作成されます。 myobjetというオブジェクトがプログラムでPloneサイトのルートフォルダに追加されたとします。私が欲しいもの

です:ときに、ユーザーアクセス

http://localhost:8080/Plone/myobject 

...それは自動的にviewedにこのオブジェクトのワークフローの状態を変更します。 URL http://localhost:8080/Plone/myobjectはデフォルトのbase_editではなくカスタム表示になります。

私はどのイベントを使用しますか?私はIEndRequestEventIBeforeTraverseEventthis listから試してみましたが、それらのどれも動作しません。ハンドラが私のカスタムオブジェクトインタフェースのために呼び出されていません。

カスタムオブジェクトインターフェイス(IObjectEditedEventなど)で他のイベントを試しました。このイベントでは、インターフェイスを実装するオブジェクトを編集するときにハンドラが呼び出されます。しかし、IEndRequestEventIBeforeTraverseEventを使用してもハンドラは呼び出されません。

IEndRequestEventIBeforeTraverseEvent私はすべてのインターフェイスに加入者を設定する場合にのみ動作します。

<subscriber 
    for="* 
      zope.app.publication.interfaces.IBeforeTraverseEvent" 
    handler=".subscriber.myhandler" 
    /> 

そして、私ははmyHandler印刷されたオブジェクトとこのような状況でイベントを作るとき、それは示しています

<PloneSite at Plone> 
<zope.app.publication.interfaces.BeforeTraverseEvent object at 0xd52618c> 

ソリューションが自分自身でイベントを書くことになっているのなら、簡単なチュートリアルはありますか?

+1

あなたは何を達成しようとしているの? –

+0

彼らのどれもが働いていないということは何を意味していますか?これを達成するためにIBeforeTraverseを使用することができます。 – toutpt

+0

@Sentinel:私が達成したいことについて、より多くの情報を追加しました。 –

答えて

4

http://pypi.python.org/pypi/plone.validatehookをご覧ください。

イベントを正しいインターフェイスにバインドしてください。これを "Interface"にバインドすると(plone.validatehook pypiページで説明されているように)、単一のリクエストごとにイベントが呼び出されます。あなたは次の操作を行うことができ、オブジェクトをcontentishするイベントを制限するために:

from Products.CMFCore.interfaces import IContentish 

@adapter(IContentish, IPostValidationEvent) 
def RedirectMember(object, event): 
    ... 

(編集:それは動作しませんでしたので、私は私の最初の答えを削除)

+0

テストしましたか?私はこれをして、それは動作しません。私は質問を編集してより多くの情報を追加しました。 –

+0

はい。私はちょうどそれをテストし、それはどちらも私のために動作しません。私は次にplone.validatehookを試してみる。 – tisto

+2

plone.validatehookが私のために働いた。 – tisto

1

このサブスクライバが何をすべきかはっきりしていませんが、オブジェクトが変更されていない、追加されている、またはそれ以外のものが表示されていると思われる場合は... __call__アイテムビュー(もしあなたがfive.grok/dexterityを使っているのであれば__update__メソッド)?

+0

ハム、これは確かに私が自分自身を考えなかったものです。ヒントをありがとう! –

+0

オブジェクトが横断されたときに__call__が呼び出されたことを確認していますか?コンテンツタイプの定義に__call__を単純なprint文で追加しても何も起こりません。 –

+1

コンテンツタイプがどのようになっているかはわかりますが、ほとんどの場合カスタムビューもあります。これがArchetypesベースのコンテンツタイプであれば、これは専用のブラウザビューで 'class MyTypeView(BrowserView)'となります。ここで何らかの処理を行うための '__init__'メソッドがあり、専用の' __call__'メソッドを追加できます。 –

関連する問題