7

私はこの Tridion の実装に取り​​組んでいます。これには非常に異なる Web サイトがたくさんありますが、一部のコンテンツ (ニュースなど) は、青写真の基本的な Tridion 原則を介して共有されます。サイトはすべて同じ言語であるため、ブランドの違いのみを扱います。

現在の状況:このグローバル コンテンツが作成されたグローバル コンテンツと呼ばれる出版物があります。スキーマには、このコンテンツが表示される子パブリケーションを選択できるチェックボックスがいくつかあります。コンポーネントが保存されると、イベント システムが開始され、コンポーネントを含むページが作成され、公開されます。コンポーネントの削除は行われず、すべてのチェックボックスをオフにして再保存するだけで、最終的にバッチ プロセスによってページが削除されます。 .

ブローカーの状況:ブローカーの使用を開始したいと考えています。将来の状況では、Web サイトはより多くのコンテンツを外部の Web サイトと共有し始めるため、これは RSS フィードまたは基本的な API を介して行い、Broker からのコンテンツで最適に機能します。

シナリオ:

  1. このグローバル コンテンツ パブリケーションが動的コンテンツをパブリッシュすることを許可し、他のサイトではそのコンテンツをブローカーから (グローバル コンテンツ パブリケーション ID を使用して) 直接プルします。
  2. グローバル コンテンツで偽の空のターゲットを作成して、「すべての子パブリケーションに発行/非発行しますか?」と言うことができるようにします。(チェックボックスを使用して、特定の出版物に公開できるようにすることもできます)
  3. グローバル コンテンツ Web サイトを使用して動的コンテンツを公開し、内部および外部の Web サイトで使用する API/RSS フィードを作成しますか?
  4. 他の何か?

私の最初の考えは最初のシナリオに行きますが、ローカル (化された) ニュース項目とグローバル ニュース項目を混在させることがより困難になるという主な欠点を見ることができます。

2 番目のシナリオは、次善のチャンスのようです。誰でもそのような実装の経験がありますか?

4

2 に答える 2

6

私が現在取り組んでいる実装では、2 番目のソリューションのようなものを使用しています。すべての Web サイトに使用するパブリケーション ターゲットに Web サイト マスター パブリケーション (すべてのページを作成する) を追加して、そこからすべての子パブリケーションにパブリッシュを使用できるようにしました。モデルに適合する場合は、子パブリケーションのローカライズによってアイテムを引き続き制御できるため、このオプションをお勧めします。

ウェブサイトのマスター パブリケーションでコンテンツをレンダリングする気がなかったので (これはどこにも行かず、パブリッシャーのプロセッサ時間の無駄になり、展開されたときにブローカー ストレージの無駄になるため)、 ChildOnlyPublicationResolver を作成しました (SDL Tridion 2011)。このリゾルバーでは、解決されたすべてのアイテムをループし、アイテムが Web サイトのマスター パブリケーションからのものである場合は、リストから削除します。

その結果、Web サイトのマスター パブリケーションがパブリッシュ キューに表示されますが、レンダリングするものが何もないため、ほぼ瞬時に成功に設定されます。したがって、パブリッシャーのパフォーマンスが低下したり、展開されたりすることはありませんが、子パブリケーションの利点を維持し、一度に簡単にパブリッシュすることができます。

興味がある場合は、リゾルバー コードの例を次に示します。

using System.Collections.Generic;
using Tridion.ContentManager;
using Tridion.ContentManager.Publishing;
using Tridion.ContentManager.Publishing.Resolving;

namespace SDL.Example.Resolvers
{
    public class ChildOnlyPublicationResolver : IResolver
    {
        /// <summary>
        /// Master Publication TCMURI
        /// </summary>
        private const string MasterPublicationTcmUri = "tcm:0-2-1";

        /// <summary>
        /// For publish and unpublish, remove all items from the master publication from the list.
        /// </summary>
        /// <param name="item">Item to be resolved (e.g. a page, structure group, template)</param>
        /// <param name="instruction">Resolve instruction</param>
        /// <param name="context">Publish context</param>
        /// <param name="resolvedItems">List of items that are currently to be rendered and published (added by previous resolvers in the chain)</param>
        public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, Tridion.Collections.ISet<ResolvedItem> resolvedItems)
        {
            List<ResolvedItem> itemsToRemove = new List<ResolvedItem>();
            TcmUri masterPublicationUri = new TcmUri(MasterPublicationTcmUri);

            // check for items from master publication (these do not need to be published or unpublished)
            foreach (ResolvedItem resolvedItem in resolvedItems)
            {
                // mark all items from website structure publication for removal
                if (resolvedItem.Item.Id.PublicationId == masterPublicationUri.ItemId)
                {
                    itemsToRemove.Add(resolvedItem);
                }
            }

            // remove all items that we need to discard
            foreach (ResolvedItem itemToRemove in itemsToRemove)
            {
                resolvedItems.Remove(itemToRemove);
            }
        }
    }
}
于 2012-03-22T10:37:00.510 に答える
2

従来のTridionアーキテクチャでは、BluePrintを介して継承するのが最善の策だった可能性があります。これは、すべての出版物のすべてのブローカーでコンテンツを利用できるようにし、メタデータから表示するアイテムを決定することを意味します。

Bartが示唆しているように、この設計にはいくつかの無駄な側面があるため、単一のWebサイトから「フェデレーション」されているグローバルコンテンツの観点から考えるとよいでしょう。これは、コンテンツ配信Webサービスの目的です。Tridion 2011を使用している場合は、オプション3を効果的に選択できますが、以前よりも多くのすぐに使用できるサポートがあるため、APIを構築する必要はなく、使用するだけです。

于 2012-03-23T07:47:33.023 に答える