2

一、总体说明:

有两个组件模板,NewsArticle 和 NewsList。NewsArticle 是 Dreamweaver 模板,用于显示新闻文章的内容。NewsList 是一个 xml 文件,其中包含有关所有新闻文章的聚合信息。

目前,内容作者必须发布新闻文章,然后重新发布新闻列表以重新生成 xml。

问题:

我的任务是让新闻文章的发布也重新生成和发布新闻列表。通过 C#,我能够检索新闻列表组件的内容,从新闻文章中生成更新的 xml,并将其合并到新闻列表中的 xml。我在发布新闻列表时遇到了麻烦。

我对文档的访问权限有限,但就我所拥有的而言,我相信使用静态 PublishEngine.Publish 方法可以让我做我需要做的事情。我相信第一个参数(项目)只是一个包含我更新的新闻列表的列表,第二个参数是一个新的 PublishInstruction,其中 RenderInstruction.RenderMode 设置为 Publish。我对 PublicationTargets 应该是什么有点迷茫。

我在正确的轨道上吗?如果是这样,对 Publish 方法调用的任何帮助表示赞赏,如果没有,有什么建议吗?

4

2 回答 2

6

就像 Quirijn 建议的那样,代理查询是最干净的方法。

在代理不可用的情况下(即仅静态发布模型),我通常从将 XML 添加为二进制文件的 TBB 生成新闻列表 XML,而不是开始发布另一个组件或页面。您可以通过在 C# TBB 中调用此方法来执行此操作:

engine.PublishingContext.RenderedItem.AddBinary(
  Stream yourXmlContentConvertedToMemoryStream, 
  string filename, 
  StructureGroup location, 
  string variantId, 
  string mimeType)

使您创建的新闻列表 XML 文件的 variantId 唯一,以便不同的组件可以覆盖/更新同一个文件。

更好的是,在页面模板而不是组件模板中执行此操作,以便每页生成一次新闻列表,而不是每个组件(如果每页有多篇文章)。

于 2012-05-04T13:03:56.317 回答
5

使用 engine.Publish() 方法,您在正确的轨道上:

PublishEngine.Publish(
    new IdentifiableObject[] { linkedComponent },
    engine.PublishingContext.PublishInstruction,
     new List() { engine.PublishingContext.PublicationTarget });

您可以从模板的当前上下文中重用 PublishInstruction 和 Target。此示例显示了一个组件,但它也应该在页面中工作。

需要记住的一件事是,这在 SDL Tridion 2011 SP1 中是不可能的,因为由于安全限制,不允许开箱即用的发布操作。我在这里有一篇关于此的文章http://www.tridiondeveloper.com/the-story-of-sdl-tridion-2011-custom-resolver-and-the-allowwriteoperationsintemplates-attribute

于 2012-05-04T12:11:56.720 回答