2

まず、全体的な説明:

NewsArticleとNewsListの2つのコンポーネントテンプレートがあります。NewsArticleはDreamweaverテンプレートであり、ニュース記事のコンテンツを表示するために使用されます。NewsListは、すべてのニュース記事に関する集約情報を含むxmlファイルです。

現在、コンテンツ作成者はニュース記事を公開してから、ニュースリストを再公開してxmlを再生成する必要があります。

問題:

私は、ニュース記事の公開にもニュースリストの再生成と公開を行うという任務を負っています。C#を使用すると、ニュースリストコンポーネントのコンテンツを取得し、ニュース記事から更新されたxmlを生成して、ニュースリストからxmlにマージすることができます。ニュースリストを公開するのに問題が発生しています。

ドキュメントへのアクセスは制限されていますが、私が持っていることから、静的なPublishEngine.Publishメソッドを使用すると、必要なことを実行できると思います。最初のパラメーター(items)は、更新されたニュースリストを含む単なるリストであり、2番目のパラメーターは、R​​enderInstruction.RenderModeがPublishに設定された新しいPublishInstructionであると思います。私は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 を一意にして、異なるコンポーネントが同じファイルを上書き/更新できるようにします。

さらに良いのは、コンポーネント テンプレートではなくページ テンプレートでこれを行い、ニュース リストがコンポーネントごとではなくページごとに 1 回生成されるようにすることです (1 ページに複数の記事がある場合)。

于 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 に答える