要在發佈過程中啓用自定義用戶首選項,我們希望在解析步驟(在自定義解析器中)找出發佈用戶是什麼(所以不是爲用戶帳戶配置發佈服務,但發起發佈操作的用戶)。如何確定在自定義解析器中發佈用戶/訪問引擎
要查找原始發佈用戶,我們需要訪問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)任何潛在的點?
順便說一句,訪問引擎將無法正常工作,因爲解析在渲染之前運行,引擎對象由模板渲染引擎實例化。 –
我明白了;我要說的是,PublishTransaction對解析器不可用,這顯然有點奇怪,因爲PublishTransaction在這種情況下啓動整個解析 - 渲染鏈。 –