2013-03-01 28 views
4

我試圖捕獲組件未發佈時。我嘗試了一些方法,但沒有我想要的結果。我的嘗試是:如何在自定義解析器中確定是否發佈或取消發佈? Tridion 2009 SP1

  1. 在事件系統中。但是這不起作用,因爲在Windows中有一個關於MSXML和COM +的已知錯誤。

  2. 我嘗試構建自己的IResolver,但在那裏我無法確定它是發佈還是取消發佈操作。

  3. 我嘗試構建自己的ITransportPackageHandler。在那裏,我有一個名爲HandleResolvedItemForUnPublishing的函數,但是我沒有任何有關PublicationTarget的信息,我不知道它是從分段還是現場未發佈的。

有人可以幫助我嗎?我認爲我可以解決這個問題,如果:

  1. 在IResolver我可以確定組件是否取消發佈。
  2. 在ITransportPackageHandler我可以訪問到PublicationTarget信息
  3. 如果我可以從IResolver在上下文中的變量或類似的東西傳遞信息到ITransportPackageHandler。

非常感謝。

Gustavo。

+0

請想張貼這疑問句的這裏也是:http://tridion.stackexchange.com/grant-beta-access?key=63880f9cbf452c62f726770209533893 – 2013-03-01 12:51:34

回答

6

您應該可以查看ResolveInstructionResolvePurpose,您可以將其作爲自定義解析程序中的一個參數。沿着這些路線的東西:

public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, ISet<ResolvedItem> resolvedItems) 
{ 
    if (instruction.Purpose == ResolvePurpose.Publish || instruction.Purpose == ResolvePurpose.RePublish) 
    { 
     // We are publishing 
    } 
    else if(instruction.Purpose == ResolvePurpose.UnPublish) 
    { 
     // We are unpublishing 
    } 
    // Don't know if this one exists in 2009, it exists in 2011 SP1 
    else if(instruction.Purpose == ResolvePurpose.UnknownByClient) 
    { 
     // The server is doing something that I don't understand (yet?) 
    } 
} 

編輯

我拒絕不能找到一種方法,使這項工作...

事實上,在2009年外表套上你沒有一個Purpose解決指令。發佈事務中確實有一個Action,但是這個不直接在解析器中公開。下面是我發現我是如何發佈或取消發佈的 - 如果認爲它過度,你的電話會非常糟糕,但在非生產虛擬機上的性能非常好。

  1. 找我們解決了
  2. 當前項目裝入PublishTransaction名單與「正在進行中」
  3. 的狀態查找該交易爲當前項目
  4. 確定由動作看Action屬性
Filter filter = new Filter(); 
filter.Conditions["InfoType"] = 2; // Get transactions in Progress 
foreach (XmlNode node in item.Session.GetList(typeof(PublishTransaction), filter)) 
{ 
    if(node.Attributes["ItemID"].Value.Equals(item.Id.ToString())) 
    { 
     // we have a winner 
     string action; 
     if (node.Attributes["Action"].Value.Equals("0")) 
      action = "Publish"; 
     if (node.Attributes["Action"].Value.Equals("1")) 
      action = "Unpublish"; 
    } 
} 
+0

謝謝Nuno,但是我的ResolveInstruction對象沒有屬性Purpose。我正在使用Tridion 2009. – Guskermitt 2013-03-01 10:55:44

+0

好吧,讓我找到2009年的虛擬機......我確定有一種方法可以找到。 – 2013-03-01 11:02:12

+0

已編輯答案並添加了查找當前發佈事務以確定操作的方式。 – 2013-03-01 12:02:29

1

假設您使用2011,可以將事件處理程序綁定到發佈事務保存事件並驗證狀態。然後,在組件未發佈時,您可以執行所需的邏輯。

public sealed class PublishedToEventHandler: TcmExtension 
{ 
    public PublishedToEventHandler() 
    { 
     EventSystem.SubscribeAsync<PublishTransaction, SaveEventArgs>(
      (subject, args, phase) => 
      { 
       if (!PublishStransactionStateIsSuccessfullyCompleted(subject)) 
        return; 



      }, 
      EventPhases.TransactionCommitted 
     ); 
    } 

    static bool PublishStransactionStateIsSuccessfullyCompleted(PublishTransaction transaction) 
    { 
     return transaction.State == PublishTransactionState.Success || 
       transaction.State == PublishTransactionState.Warning; 
    } 
} 

東西之前在此事件的處理可以驗證交易的Instruction.ResolveInstruction.Purpose屬性看你是否是在取消發佈發佈。

交易有一個ProcessedItems集合,並且每個集合都包含對象的ResolvedItem.Item實例中的頁面或組件。當它的頁面需要獲取頁面上嵌入的組件以便對它們做任何事情時。

讓我知道你是否還有其他問題。

+0

嗨,我正在使用Tridion 2009 SP1。 – Guskermitt 2013-03-01 09:49:31

相關問題