2012-10-26 42 views
5

要在發佈過程中啓用自定義用戶首選項,我們希望在解析步驟(在自定義解析器中)找出發佈用戶是什麼(所以不是爲用戶帳戶配置發佈服務,但發起發佈操作的用戶)。如何確定在自定義解析器中發佈用戶/訪問引擎

要查找原始發佈用戶,我們需要訪問PublishTransaction對象(特別是Creator屬性);我們不能使用自定義解析程序中Session的User屬性,因爲此Session是由發佈服務創建的(並且會給我們服務帳戶)。

查找當前的PublishTransaction Mihai has provided us with an excellent hack。 實質上;如果我們能夠掌握Engine對象,則可以確定上下文發佈事務。

在我們的自定義解析的解決方法被調用四個參數:

public void Resolve(
    IdentifiableObject item, 
    ResolveInstruction instruction, 
    PublishContext context, 
    ISet<ResolvedItem> resolvedItems 
) { } 
  • 該項目可以用來爲我們提供一個Session對象,但既不是IdentifiableObject,也不是一個會話保持到一個參考發動機。
  • 解析指令只是解析的一組數據屬性。
  • 發佈上下文(不幸不是發佈上下文)僅包含發佈和發佈目標。
  • ResolvedItem可以讓我們再次訪問會話,但不是引擎。

我的問題(最終)將是雙重的:
1.我錯過了在上下文用戶帳戶可以從確定(除PublishTransaction)任何潛在的點?
2.我是否錯過了可以從IResolver.Resolve()方法被調用的參數中確定引擎的潛在點?


編輯:我知道我離開了我們爲什麼要定製額外的元數據(從用戶偏好)發佈活動,因爲它是一個有點一言難盡的,退一步海闊天空;

我最終需要的是在組件模板中激活特定版本的組件(通過遍歷版本列表並找到鏈接到專用標記組件的版本),但爲了做到這一點,我需要了解標記組件是什麼。出於這個原因,我們發佈標記組件(它將解析所有鏈接的組件和最終的頁面),並且自定義解析器允許我們將標記組件的TCMURI推入會話緩存(使其可在CT中訪問)。

現在我們要爲用戶級別的特定標記組件設置一個「首選項」,以允許在此標記上下文中發佈較小批次的資產(而不是一次發佈鏈接到標記的所有內容)。因爲在CT內部運行的TBB實際上有一個可用的Engine對象,所以我們可以使用Mihai的方法並確定發佈用戶(而不是從解析器中推出標記上下文,而不是我們最初做的),並以這種方式繞過這個問題完全。

我想知道爲什麼在解析和渲染操作之間信息可用性存在這樣的差異;兩者都是同一出版背景的最後一部分。我不禁感到我忽略了一些非常基本的東西,但也許我不是,並且從解析器訪問發佈上下文或引擎是根本不可能的。


編輯:由Dominic推測並由Nuno確認在解析時沒有「引擎」因爲我的問題的這一半已經得到解答。 這使得

我錯過了在上下文用戶帳戶可以從確定(除PublishTransaction)任何潛在的點?

回答

5

我之前在一個項目中嘗試讓用戶參與解析器擴展,並且這是一個痛苦的世界。

我從一個Resolver擴展名移動到一個渲染擴展,甚至考慮一個傳輸擴展,只是爲了回到最簡單的方法:一個TBB。

當然,我的用例與你的不同,因爲它看起來像你可能想改變基於用戶的解析行爲(一些用戶不喜歡鏈接傳播,對嗎? - 如果他們害怕改變內容,那麼他​​們不應該改變它;-))但我結束了而不是這樣實現。

認爲有一個增強請求包含有關用戶觸發發佈操作的更多信息,但如果在產品中實現該功能,則將用於Tridion 2013,不確定您可以等那麼久。

+0

順便說一句,訪問引擎將無法正常工作,因爲解析在渲染之前運行,引擎對象由模板渲染引擎實例化。 –

+0

我明白了;我要說的是,PublishTransaction對解析器不可用,這顯然有點奇怪,因爲PublishTransaction在這種情況下啓動整個解析 - 渲染鏈。 –

0

我猜你在這一點上無法掌握引擎。畢竟,你正在解決,而不是渲染。你提到你想要「啓用用戶偏好」,但是你不會告訴我們更多關於你的實際問題的信息,而不是你目前正在進行的調查(可能會也可能不會是死路一條)。

什麼樣的用戶偏好與發佈有關,您爲什麼需要將它們放在解析器中?

相關問題