gpt4 book ai didi

tridion - 将DCP放置在Tridion中的页面上后,如何确保该组件的所有动态渲染图都随页面一起发布?

转载 作者:行者123 更新时间:2023-12-04 13:53:33 25 4
gpt4 key购买 nike

发布具有多个动态模板的组件通常会导致将所有可能的动态组件演示文稿发布给代理。

当您创建带有将项目放置在页面上的选项的DCT时,内容编辑器可能不希望直接发布组件,而只是依靠页面发布来做正确的事情。我们可以考虑三种可能的期望发布方案:

  • 发布页面仅应导致呈现静态组件演示(以及显示动态组件演示所需的任何CD代码)
  • 除了静态CP,还应该发布任何动态CP。不会发布同一组件的其他可能的动态渲染。
  • 如果发布了动态CP,则遵循通常的组件发布语义,
    并且所有动态效果图都将转给代理。

  • Tridion的默认行为似乎是场景2),而我的经验是场景3)通常是您想要的,它为您提供了一个完整且
    CD上任何给定组件的一致 View 。

    实现方案3(包括取消发布才能正常工作)的最佳方法是什么?

    最佳答案

    我认为,针对您的问题的最佳答案是实现一个自定义的解析器,其中包括所需的动态组件表示。我会在发布时警惕任何事情,因为有时您可能想在发布给定页面后保留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,以便在每个解析操作之后(在每种项目类型的解析/映射下)都调用此解析器。

    关于tridion - 将DCP放置在Tridion中的页面上后,如何确保该组件的所有动态渲染图都随页面一起发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9341489/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com