4

SDL Tridion 的内容管理器模板 API (TOM.NET) 提供了检测发布或呈现上下文的方法。

用例

  • 向特定环境提供调试信息(例如,仅在暂存时提供 TCM Uris)
  • 在预览中显示不同的标记(例如显示指向已发布页面的链接)
  • 在 Experience Manager 或 SiteEdit 中显示不同的可创作字段

我已经看过并尝试了一些示例,但是在与同事StanEric聊天之后,我想确保我关注 TOM.NET (6.1 / Tridion 2011)。

场景

  1. 发布到特定的发布目标(通常是“Live”和“Staging”)
  2. 内容管理器资源管理器(CME) 预览
  3. Experience Manager (XPM) 的会话预览渲染
  4. (添加)模板生成器

1. 发布到目标(或从出版物)

Tridion.ContentManager.Publishing.PublishEngine.GetPublishInfo(IdentifiableObject item)

项目将是一个页面或组件。这将返回一个PublishInfo对象集合,其中包括PublicationTarget确认您要发布到的位置。

Tridion.ContentManager.Templating.PublishingContext.PublicationTarget也有PublicationTarget

2.芝商所预览

PublicationTarget 是null,这是有道理的,因为您没有 Publication Target 。:-)

3. 会议预览

使用RenderMode下面的枚举Tridion.ContentManager.Publishing,它具有:

  • '发布' (0)
  • 'PreviewStatic' (1)
  • 'PreviewDynamic' (2)

PublicationTarget 不会null用于 Session Preview,它并不是真正的发布

4.(添加)模板生成器

?

Alexander Klock 还描述了一些相关示例,这些示例涵盖了除 CME Preview 之外的大部分内容。

问题)

  • 我错过了任何场景吗?发布到特定发布目标、定期预览和 XPM 会话预览?

  • 我应该如何避免硬编码 PublicationTargets(例如检查字符串值而不是 TCM Uris 更好)?

  • 更新:根据 Vikas 的回答将模板生成器添加到列表中,我怎么知道我正在模板生成器中渲染?

4

2 回答 2

4

您对完整的发布/预览模型提出了很好的看法。这是我的想法..

Are we missing any scenarios? 

我认为您涵盖了除模板构建器案例之外的所有内容,这类似于 CME 预览,我们将发布目标设为空,但可用于检查对调试目的非常重要的不同条件。

How should I avoid hard-coding PublicationTargets  

是的,我们不应该在任何代码中使用 tcm uri,因为您建议我们可以使用名称,甚至可以在该程序的相应配置文件中配置名称。

在这里也可能不相关,除了暂存之外,为 Tridion UI 编辑设置单独的目标总是好的。两者都可以在具有两个部署者的同一服务器上进行配置。一种可能是 staging.yoursite.com,另一种可能是 tridionui.yoursite.com

谢谢..

于 2013-01-28T20:46:53.997 回答
4

你真的需要一个关于这个问题的tl;博士......

这是我所知道的:

模板生成器

发布目标为 null,RenderMode 为 PreviewDynamic

芝商所预览

Publication Target ID 为 tcm:0-0-0(或TcmUri.UriNull),RenderMode 为 PreviewDynamic

会话预览

Publication Target ID 为真实目标 ID,RenderMode 为 PreviewDynamic

发布

Publication Target 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
}
于 2013-02-01T08:31:09.590 回答