На мой взгляд, лучшим ответом на ваш вопрос является реализация настраиваемого резольвера, который будет включать необходимые презентации динамических компонентов. Я бы не хотел делать что-либо при отмене публикации, так как иногда вы можете захотеть сохранить 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, чтобы этот Resolver вызывался после каждого действия разрешения (при разрешении / сопоставлении для каждого типа элемента).