私の意見では、あなたの質問に対する最良の答えは、必要な動的コンポーネント プレゼンテーションを含むカスタム リゾルバーを実装することです。特定のページを非公開にした後も 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 を変更して、すべての解決アクションの後にこのリゾルバーが呼び出されるようにする必要があります (すべての項目タイプの解決/マッピングの下)。