如何确定自定义解析程序中的发布用户/访问引擎

时间:2012-10-26 10:25:02

标签: tridion resolver

要在发布期间启用自定义用户首选项,我们希望在解析步骤(自定义解析程序内)中找出发布用户的内容(因此不是为发布服务配置的用户帐户,而是启动发布操作的用户)。

要查找原始发布用户,我们需要访问PublishTransaction对象(特别是Creator属性);我们无法在自定义解析程序中使用Session中的User属性,因为此Session是由Publisher服务创建的(并且会为我们提供服务帐户)。

查找当前的PublishTransaction Mihai has provided us with an excellent hack。 在本质上;如果我们能够掌握Engine对象,我们就可以确定上下文发布事务。

在我们的自定义解析器中,使用四个参数调用Resolve方法:

public void Resolve(
    IdentifiableObject item,
    ResolveInstruction instruction, 
    PublishContext context, 
    ISet<ResolvedItem> resolvedItems
) { }
  • 该项可用于向我们提供Session对象,但IdentifiableObject和Session都不包含对Engine的引用。
  • resolve指令只是解析的一组数据属性。
  • 发布上下文(遗憾的是不是PublishingContext)仅包含发布和发布目标。
  • ResolvedItem可以让我们再次访问Session而不是Engine。

我的问题(最后)将是双重的:
1.我是否错过了可以确定上下文用户帐户的任何潜在点(PublishTransaction除外)? 2.我是否错过了可以从调用IResolver.Resolve()方法的参数确定引擎的任何潜在点?


编辑:我意识到我忽略了为什么我们想要使用额外的元数据(来自用户首选项)自定义发布活动的更广泛的图片,因为它有点长篇故事;

我最终需要激活组件模板中特定版本的组件(通过走向版本列表并找到链接到专用标记组件的版本)但是为了做到这一点,我需要知道标记组件是什么。出于这个原因,我们发布了标记组件(它将解析所有链接的组件和最终的页面),自定义解析器允许我们将标记组件的TCMURI推送到会话缓存中(使其可以在CT中访问)。

现在我们要为用户级别的特定标记组件设置“首选项”,以允许在此标记上下文中发布较小批量的资产(而不是一次发布链接到标记的所有内容)。

因为在CT内部运行的TBB实际上有可用的Engine对象,我们可以使用Mihai的方法并确定发布用户(而不是从解析器中推送标记上下文,而不是我们最初做的)并以这种方式绕过完全问题。

我想知道为什么在解析和渲染操作之间信息可用性存在这样的差异;两者都是同一出版背景的后续部分。我不禁觉得我忽略了一些非常基本的东西,但也许我不是,从解析器访问发布上下文或引擎根本不可能。


编辑:由Dominic推定并由Nuno确认,在解决时没有“引擎”;因此我的问题的这一半已得到回答。 离开

  

我是否错过了可以确定上下文用户帐户的任何潜在点(PublishTransaction除外)?

2 个答案:

答案 0 :(得分:5)

我之前在一个项目中走了这条路(试图让用户进入Resolver扩展)并且这是一个痛苦的世界。

我从Resolver扩展程序移动到渲染扩展程序,甚至考虑了传输扩展程序,只是为了回到最简单的方法:TBB。

当然,我的用例与您的用例不同,因为看起来您可能希望根据用户更改解析行为(有些用户不喜欢链接传播,对吧? - 如果他们害怕更改内容,那么他们不应该改变它;-))但我最终以这种方式实现它。

认为有一个增强请求,其中包含有关用户触发发布操作的更多信息,但如果在产品中实现了这一点,那将是针对Tridion 2013的,不确定是否可以等待那么久

答案 1 :(得分:0)

我猜你现在无法掌握引擎。毕竟,你正在解决,而不是渲染。你提到你想要“启用用户首选项”,但是你没有告诉我们更多关于你的实际问题,而不是你当前正在关注的调查线(这可能是也可能不是死路一条)。

哪种用户偏好与发布相关,为什么需要将它们放在解析器中?