6

複数の動的テンプレートを持つコンポーネントを公開すると、通常、可能なすべての動的コンポーネントのプレゼンテーションがブローカーに公開されます。

アイテムをページに配置するオプションを使用してDCTを作成する場合、コンテンツエディターはコンポーネントを直接公開したくない場合があり、単にページ公開に依存して正しいことを行います。考えられる3つの望ましい公開シナリオを検討できます。

  1. ページを公開すると、静的コンポーネントのプレゼンテーションのみがレンダリングされます(さらに、動的コンポーネントのプレゼンテーションに必要なCDコードはすべてレンダリングされます)。
  2. 静的CPに加えて、動的CPを公開する必要があります。同じコンポーネントの他の可能な動的レンダリングは公開されていません。
  3. 動的CPが公開される場合、通常のコンポーネント公開セマンティクスに従い、すべての動的レンダリングがブローカーに送られます。

Tridionのデフォルトの動作はシナリオ2)のように見えますが、私の経験では、多くの場合、必要なのはシナリオ3)であり、CD側の特定のコンポーネントの完全で一貫したビューを提供します。

シナリオ3を実装するための最良の方法は何ですか(非公開を正しく機能させることを含む)?

4

2 に答える 2

8

私の意見では、あなたの質問に対する最良の答えは、必要な動的コンポーネント プレゼンテーションを含むカスタム リゾルバーを実装することです。特定のページを非公開にした後も DCP を保持したい場合があるため (「最新ニュース」タイプの機能やその他の種類の動的クエリのために)、非公開のときに何かをすることには注意が必要ですが、以下のコード サンプルではそれが可能です。すべての DCP を非公開にする必要がある場合は、簡単に適応できます。

警告: 以下のコードは本番環境でテストされていません。

using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Publishing;
using Tridion.ContentManager.Publishing.Resolving;

public class IncludeDynamicComponentPresentations : IResolver
{
    public void Resolve(
            IdentifiableObject item, 
            ResolveInstruction instruction,
            PublishContext context, 
            Tridion.Collections.ISet<ResolvedItem> resolvedItems)
    {

        if (!(instruction.Purpose == ResolvePurpose.Publish ||
            instruction.Purpose == ResolvePurpose.RePublish))
        {
            // Do nothing more when unpublishing
            return;
        }

        Session session = item.Session;
        foreach (ResolvedItem resolvedItem in resolvedItems)
        {
            // Only do something if we're dealing with a page
            if (!(resolvedItem.Item is Page)) continue;
            Page page = (Page)resolvedItem.Item;
            if (page.ComponentPresentations.Count > 0)
            {
                UsingItemsFilter filter = new UsingItemsFilter(session);
                filter.InRepository = page.ContextRepository;
                filter.ItemTypes = new[] { ItemType.ComponentTemplate };

                foreach (ComponentPresentation cp in page.ComponentPresentations)
                {
                    // Find all component templates linked to this component's schema
                    Schema schema = cp.Component.Schema;
                    foreach (ComponentTemplate ct in schema.GetUsingItems(filter))
                    {
                        if (!ct.Id.Equals(cp.ComponentTemplate.Id))
                        {
                            if (ct.IsRepositoryPublishable)
                            {
                                resolvedItems.Add(new ResolvedItem(cp.Component, ct));
                            }
                        }
                    }
                }
            }
        }
    }
}

これを GAC に追加し、[Tridion]\Config\Tridion.ContentManager.Config を変更して、すべての解決アクションの後にこのリゾルバーが呼び出されるようにする必要があります (すべての項目タイプの解決/マッピングの下)。

于 2012-02-18T13:57:40.017 に答える
3

このような状況では、カスタム リゾルバーが役立つのではないでしょうか? これにより、公開アクションの結果であるすべてのアイテムにアクセスできるようになり、デフォルトの動作を変更できるようになります。

SDL Tridion ドキュメンテーション ポータルにこの良い例がありますが、基本的には、カスタム ロジックを実装できるカスタム リゾルバ クラスを .net で作成できます。

于 2012-02-18T13:56:56.070 に答える