Tridion 2009 - 从组件模板发布另一个组件

时间:2012-05-04 12:06:03

标签: tridion

首先,整体说明:

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

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

问题:

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

我对文档的访问权限有限,但据我所知,我相信使用静态PublishEngine.Publish方法可以让我做我需要的。我相信第一个参数(items)只是一个包含我更新的新闻列表的列表,第二个参数是一个新的PublishInstruction,RenderInstruction.RenderMode设置为Publish。我对于出版物应该是什么感觉有点迷失。

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

2 个答案:

答案 0 :(得分:6)

像Quirijn建议的那样,经纪人查询是最干净的方法。

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

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

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

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

答案 1 :(得分:5)

你在这里使用engine.Publish()方法:

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

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

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