4

TridionEventSystemは初めてです。私は小さなコードを書きました。

[TcmExtension("MyEventHandlerExtension")]
public class EH : TcmExtension
{
    public EH()
    {
        Subscribe();
    }
    public void Subscribe()
    {
        //EventSystem.Subscribe<Component, DeleteEventArgs>(HandlerForInitiated, EventPhases.Initiated);
        EventSystem.Subscribe<Tridion.ContentManager.CommunicationManagement.Page, Tridion.ContentManager.Extensibility.Events.PublishOrUnPublishEventArgs>(HandlerForCommitted, EventPhases.All);
    }

    private void HandlerForCommitted(IdentifiableObject subject, PublishOrUnPublishEventArgs args, EventPhases phase)
    {

        TDSE obj = new TDSE();
        Tridion.ContentManager.Interop.TDS.Publication pub = obj.GetPublication("tcm:0-150-1");
        Tridion.ContentManager.Interop.TDS.Page pubPage = obj.GetPage("tcm:150-12374-64", pub);
        pubPage.Publish("tcm:0-1-65538", false, true, false, default(DateTime), default(DateTime), default(DateTime));

    }
}

このコードを使用して、公開および非公開イベントが発生するたびにページを公開したいと思いました。このコードを作成し、そのパスをtridion構成ファイルに登録します。しかし、それは機能していません。助けてください

4

3 に答える 3

8

まず、TDSE コードをすべて削除します。TOM.NET を使用する必要があります。次のようにセッションを取得できますsubject.Session

次に、この拡張機能を登録Tridion.ContentManager.configしてシステムを再起動したことを確認してください

最後に、何かがうまくいかない場合はHandlerForCommitted、イベントが発生するたびにファイルを作成する簡単なコードを追加するだけで、拡張機能が実行されるかどうかを確認できます。

于 2012-10-31T12:20:16.020 に答える
6

2011 Event System は、TOM API ではなく TOM.NET API を使用します。2011 Event System で新しい TDSE オブジェクトを作成しないでください。古い相互運用ライブラリを参照することはできますが、2011 で参照する理由はありません。TOM.NET ライブラリを使用すると、パフォーマンスが向上し、コードは将来的にも保証されます。

Mihai Cadariu は、TOM.NET を使用して Tridion テンプレートからページを発行する良い例を示しています。コードを調整してプレビュー モードまたはパブリッシュ モードをチェックし、(現在のトランザクションから読み取るのではなく) 独自のユーザーと優先順位を設定すると、うまく機能するはずです。

http://yatb.mitza.net/2012/05/publishing-from-template-code-using.htmlのコードの下

public void Publish(Engine engine, String tcmUri, User user, PublishPriority priority)
{
    Session session = new Session(user.Title);

    PublishInstruction publishInstruction = new PublishInstruction(session);
    RenderInstruction renderInstruction = new RenderInstruction(session);
    renderInstruction.RenderMode = RenderMode.Publish; // work around. needs to be specified for binaries.
    publishInstruction.RenderInstruction = renderInstruction;

    List<IdentifiableObject> items = new List<IdentifiableObject>() { session.GetObject(tcmUri) };
    List<PublicationTarget> targets = new List<PublicationTarget>() { engine.PublishingContext.PublicationTarget };
    PublishEngine.Publish(items, publishInstruction, targets, priority);

    session.Dispose();
}

// called with
 PublishTransaction currentTransaction = TemplateUtils.GetPublishTransaction(engine);
    TemplateUtils.Publish(engine, itemUri, currentTransaction.Creator, currentTransaction.Priority);
于 2012-10-31T12:25:22.480 に答える
4

あなたのコードには、私が「通常」忘れている3つのことがあるようです。

  1. クラスはpublic
  2. それは伸びるTcmExtension
  3. それはTcmExtension属性を持っています

クラスを構成ファイルに正しく登録した場合は、関連するモジュールを再起動するだけです。この場合、それらは Publisher サービスと TcmServiceHost サービスであると予想されます。

これらのモジュールを再起動してパブリッシュ アクションをトリガーすると、拡張機能が読み込まれているというイベントがログに記録されていることが (Windows イベント ビューアーに) 表示されます。

それでも表示される場合は、アセンブリが関連する Tridion プロセスに読み込まれ、クラスが認識されてインスタンス化されていることを意味します。

この段階でハンドラーが起動しない場合は、別のイベントをリッスンすることを検討する必要がある場合があります。パブリッシングと対話したいときはいつでも、 の代わりに のSaveEventArgsを聞くことになります。PublishTransactionPublishOrUnPublishEventArgsPage

于 2012-10-31T13:49:22.297 に答える