2012-10-31 107 views
4

我是Tridion事件系統的新手。我寫了一個小代碼。事件不起作用

[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配置文件中註冊它的路徑。 但它沒有工作。請幫助

+0

請標記下面的解決方案之一,如果他們解決了您的問題 – robrtc

+0

僅供參考,它可能失敗,因爲您沒有在TDSE上調用Initialize和Impersonate。但正如其他人所說的那樣,你不應該使用舊的TOM - 使用TOM.NET。 –

回答

8

好吧,首先刪除所有的TDSE代碼,你應該使用TOM.NET。你可以得到會話subject.Session

然後確保你已經在Tridion.ContentManager.config註冊這個擴展並重新啓動您的系統

最後 - 如果有什麼不工作,只是添加簡單的代碼,將在您的HandlerForCommitted創建一個文件每當事件發生時,這樣你就可以看到你的擴展是否被執行。

6

2011事件系統使用TOM.NET API而不是TOM API。請勿在2011年事件系統中創建新的TDSE對象。儘管您可以參考舊的Interop庫,但在2011年沒有理由這樣做。使用TOM.NET庫應該會看到更好的性能,而且代碼也是面向未來的。

Mihai Cadariu有一個nice example,他使用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); 
4

你的代碼似乎有三件事我 「正常」 忘記:

  1. 類是public
  2. 它延伸TcmExtension
  3. 它有a TcmExtension屬性

如果您已經在配置文件中正確註冊了類,它應該只是重新啓動相關模塊的問題。在這種情況下,我希望這些是發佈者和TcmServiceHost服務。

重新啓動這些模塊並觸發發佈操作後,您應該看到正在加載擴展的事件(在Windows事件查看器中)。

如果甚至顯示,這意味着您的程序集正在加載到相關的Tridion進程中,並且類正在被識別和實例化。

如果在這個階段你的處理程序不啓動,你可能不得不考慮收聽不同的事件。無論何時我想要與發佈交互,我最終都會收聽PublishTransactionSaveEventArgs,而不是Page上的PublishOrUnPublishEventArgs