为了在发布期间启用自定义用户首选项,我们希望在解析步骤(在自定义解析器中)找出发布用户是什么(因此不是为发布者服务配置的用户帐户,而是启动发布操作的用户)。
要找到原始发布用户,我们需要访问 PublishTransaction 对象(特别是 Creator 属性);我们不能在自定义解析器中使用 Session 中的 User 属性,因为这个 Session 是由 Publisher 服务创建的(并且会给我们服务帐户)。
要查找当前的 PublishTransaction,Mihai 为我们提供了出色的 hack。在本质上; 如果我们可以得到一个 Engine 对象,我们就可以确定上下文发布事务。
在我们的自定义解析器中,使用四个参数调用 Resolve 方法:
public void Resolve(
IdentifiableObject item,
ResolveInstruction instruction,
PublishContext context,
ISet<ResolvedItem> resolvedItems
) { }
- 该项目可用于为我们提供 Session 对象,但 IdentifiableObject 和 Session 都没有对引擎的引用。
- 解析指令只是解析的一组数据属性。
- 发布上下文(不幸的是不是 PublishingContext)仅包含发布和发布目标。
- ResolvedItem 可以让我们再次访问 Session 但不能访问引擎。
我的问题(最后)有两个方面:
1.我是否错过了可以确定上下文用户帐户的任何潜在点(除了 PublishTransaction)?
2. 我是否错过了可以从调用 IResolver.Resolve() 方法的参数来确定引擎的任何潜在点?
编辑:我意识到我忽略了为什么我们要使用额外的元数据(来自用户偏好)自定义发布活动的更广泛的画面,因为它有点长篇大论;
我最终需要的是在组件模板中激活组件的特定版本(通过遍历版本列表并找到链接到专用标记组件的版本),但为了做到这一点,我需要知道标记组件是。出于这个原因,我们发布了标记组件(它将解析所有链接的组件并最终解析页面),并且自定义解析器允许我们将标记组件的 TCMURI 推送到会话缓存中(使其在 CT 中可访问)。
现在我们想在用户级别为特定标记组件设置“首选项”,以允许在此标记上下文中发布较小批量的资产(而不是一次发布链接到标记的所有内容)。
因为在 CT 中运行的 TBB 实际上确实有一个可用的 Engine 对象,所以我们可以使用 Mihai 的方法并确定发布用户(而不是像我们最初所做的那样从解析器推送标记上下文),这样就完全绕过了这个问题。
我想知道为什么解析和渲染操作之间的信息可用性存在如此大的差异;毕竟两者都是同一出版环境的一部分。我不禁觉得我忽略了一些非常基本的东西,但也许我没有,而且从解析器访问发布上下文或引擎根本是不可能的。
编辑:正如 Dominic 所推测并由 Nuno 确认的那样,在解决时没有“引擎”;因此,我的问题的这一半已经得到解答。那离开
我是否错过了可以从中确定上下文用户帐户的任何潜在点(PublishTransaction 除外)?