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

Dav*_*one 2 tridion

一,整体说明:

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

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

问题:

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

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

我是在正确的轨道上吗?如果是这样,感谢发布方法调用的任何帮助,如果没有,任何建议?

Nic*_*kov 6

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

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

engine.PublishingContext.RenderedItem.AddBinary(
  Stream yourXmlContentConvertedToMemoryStream, 
  string filename, 
  StructureGroup location, 
  string variantId, 
  string mimeType)
Run Code Online (Sandbox Code Playgroud)

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

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


Chr*_*ers 5

你在这里使用engine.Publish()方法在正确的轨道上:

PublishEngine.Publish(
    new IdentifiableObject[] { linkedComponent },
    engine.PublishingContext.PublishInstruction,
     new List() { engine.PublishingContext.PublicationTarget });
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我会小心这种逻辑.说你的newslist.xml包含10篇文章.如果您一次发布所有10个,则新闻列表页面将被放入队列10次.无论如何,这个xml是什么?如果只是创建所有新闻文章的列表,为什么不使用代理查询?列表将始终是最新的,无需重新发布. (3认同)