发布具有多个动态模板的组件通常会导致向代理发布所有可能的动态组件演示文稿。
当您创建具有将项放置在页面上的选项的DCT时,内容编辑器可能不希望直接发布组件,只需依赖页面发布来做正确的事情。我们可以考虑三种可能需要的发布场景:
。
Tridion的默认行为似乎是场景2),而我的经验是,通常您想要的是场景3),为您提供CD端任何给定组件的完整和一致的视图。
实现场景3的最佳方法是什么(包括取消发布以正确工作)?
发布于 2012-02-18 13:57:40
在我看来,对您的问题最好的答案是实现一个自定义Resolver,它将包括所需的动态组件演示文稿。在取消发布时,我会非常谨慎,因为有时您可能希望在取消发布给定页面(对于“最新消息”类型的功能或任何其他类型的动态查询)之后保留DCPs,但是下面的代码示例将使您在需要取消发布所有DCPs时能够简单地进行调整。
警告:下面的代码不是生产测试的。
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 (每个项类型的Resolver/映射)。
发布于 2012-02-18 13:56:56
在这种情况下,一个自定义解析器可能会有所帮助吗?这将使您能够访问发布操作的结果的所有项,从而允许您更改默认行为。
SDL文档门户中有一个很好的例子,但它基本上允许您在.net中创建一个自定义解析器类,您可以在其中实现自定义逻辑。
https://stackoverflow.com/questions/9341489
复制相似问题