SDL Tridion的Content Manager模板API(TOM.NET)提供了检测发布或呈现上下文的方法。
我已经看过并尝试了一些示例,但在跟随同事Stan和Eric之后进行聊天之后,我想确保遵循TOM.NET(6.1 / Tridion 2011)。
Tridion.ContentManager.Publishing.PublishEngine.GetPublishInfo(IdentifiableObject item)
项目将是一个页面或组件。这会返回PublishInfo
个对象的集合,其中包含 PublicationTarget
,以确认您要发布到的位置。
Tridion.ContentManager.Templating.PublishingContext.PublicationTarget
也有PublicationTarget
。
PublicationTarget是null
,这是有道理的,因为您没有发布目标。 : - )
使用RenderMode
下的Tridion.ContentManager.Publishing
枚号,其中包含:
PublicationTarget不会是null
,而实际上并非发布。
吗
Alexander Klock also describes some related examples除CME预览外,其中大部分内容都包含在内。
我是否遗漏了任何方案?发布到特定的发布目标,定期预览和XPM会话预览?
我应该如何避免硬编码PublicationTargets(例如,检查字符串值而不是TCM Uris是否更好?)
更新:根据Vikas的回答将模板生成器添加到列表中,我如何知道我在模板生成器中呈现?
答案 0 :(得分:4)
您提供了完整发布/预览模型的非常好的视图。这是我的想法..
Are we missing any scenarios?
我认为你涵盖了模板构建器案例的所有内容,它与CME预览类似,我们将发布目标作为null,但可用于检查不同的条件,这对于调试目的非常重要。
How should I avoid hard-coding PublicationTargets
是的,我们不应该在任何代码中使用tcm uri,因为您建议我们可以使用名称,甚至可以在该程序的相应配置文件中配置名称。
此处也可能不相关,除了分段之外,Tridion UI编辑具有单独的目标总是好的。两者都可以在具有两个部署者的同一服务器上配置。一个可能是staging.yoursite.com,其他可能是tridionui.yoursite.com
谢谢..
答案 1 :(得分:4)
你真的需要一个关于这个问题的博士......
以下是我所知道的:
模板生成器
发布目标为空,RenderMode为PreviewDynamic
CME预览
发布目标ID为tcm:0-0-0(或TcmUri.UriNull
),RenderMode为PreviewDynamic
会话预览
发布目标ID是真正的目标ID,RenderMode是PreviewDynamic
发布
发布目标ID是真实的,RenderMode是Publish
修改强>
这是我最近编写的一些示例代码,用于确定当前模式。
private CurrentMode GetCurrentMode()
{
RenderMode renderMode = _engine.RenderMode;
if (renderMode == RenderMode.Publish) return CurrentMode.Publish;
if (renderMode == RenderMode.PreviewDynamic)
{
if (_engine.PublishingContext.PublicationTarget == null) return CurrentMode.TemplateBuilder;
PublicationTarget target = _engine.PublishingContext.PublicationTarget;
if (target.Id.Equals(TcmUri.UriNull)) return CurrentMode.CmePreview;
return CurrentMode.SessionPreview;
}
return CurrentMode.Unknown;
}
private enum CurrentMode
{
TemplateBuilder,
CmePreview,
SessionPreview,
Publish,
Unknown
}