Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当DCP放置在Tridion中的页面上时,如何确保组件的所有动态呈现都随页面一起发布?_Tridion - Fatal编程技术网

当DCP放置在Tridion中的页面上时,如何确保组件的所有动态呈现都随页面一起发布?

当DCP放置在Tridion中的页面上时,如何确保组件的所有动态呈现都随页面一起发布?,tridion,Tridion,发布具有多个动态模板的组件通常会导致将所有可能的动态组件表示发布到代理 当您创建DCT并选择将项目放置在页面上时,内容编辑器可能不希望直接发布组件,只需依靠页面发布来完成正确的操作。我们可以考虑三种可能需要的发布场景: 发布页面只会导致呈现静态组件演示文稿(加上显示动态组件所需的任何CD代码) 除静态CP外,还应发布任何动态CP。未发布同一组件的其他可能的动态渲染 如果发布动态CP,则遵循通常的组件发布语义, 所有动态渲染都将提交给代理 Tridion的默认行为似乎是场景2),而我的经验是,通常

发布具有多个动态模板的组件通常会导致将所有可能的动态组件表示发布到代理

当您创建DCT并选择将项目放置在页面上时,内容编辑器可能不希望直接发布组件,只需依靠页面发布来完成正确的操作。我们可以考虑三种可能需要的发布场景:

  • 发布页面只会导致呈现静态组件演示文稿(加上显示动态组件所需的任何CD代码)
  • 除静态CP外,还应发布任何动态CP。未发布同一组件的其他可能的动态渲染
  • 如果发布动态CP,则遵循通常的组件发布语义, 所有动态渲染都将提交给代理
  • Tridion的默认行为似乎是场景2),而我的经验是,通常你想要的是场景3),给你一个完整的 CD端任何给定组件的一致视图


    实现场景3的最佳方法是什么(包括使“取消发布”正常工作)?

    在这种情况下,自定义解析器可能会有所帮助?这将允许您访问发布操作结果中的所有项目,从而允许您更改默认行为


    SDL Tridion文档门户中有一个很好的例子,但它基本上允许您在.net中创建一个自定义解析器类,您可以在其中实现自定义逻辑。

    在我看来,解决您问题的最佳答案是实现一个自定义解析器,其中包括所需的动态组件表示。在取消发布时,我会小心做任何事情,因为有时您可能希望在取消发布给定页面后保留DCP(对于“最新新闻”类型的功能或任何其他类型的动态查询),但下面的代码示例将使您在需要取消发布所有DCP时可以轻松地进行调整

    警告:以下代码未经过生产测试

    使用Tridion.ContentManager;
    使用Tridion.ContentManager.CommunicationManagement;
    使用Tridion.ContentManager.ContentManagement;
    使用Tridion.ContentManager.Publishing;
    使用Tridion.ContentManager.Publishing.Resolving;
    公共类IncludeDynamicComponentPresentations:IResolver
    {
    公共无效解决方案(
    可识别的对象项,
    解析指令指令,
    出版语境,
    Tridion.Collections.ISet resolvedItems)
    {
    如果(!(instruction.Purpose==ResolvePurpose.Publish)||
    指令.Purpose==ResolvePurpose.Repubish)
    {
    //取消发布时不执行其他操作
    返回;
    }
    会话=项目会话;
    foreach(ResolvedItem resolvedItems中的ResolvedItem ResolvedItem)
    {
    //只有在处理页面时才能执行某些操作
    如果(!(resolvedItem为第页))继续;
    Page Page=(第页)resolvedItem;
    如果(page.ComponentPresentations.Count>0)
    {
    UsingItemsFilter筛选器=新建UsingItemsFilter(会话);
    filter.InRepository=page.ContextRepository;
    filter.ItemTypes=new[]{ItemType.ComponentTemplate};
    foreach(第页中的组件演示文稿cp.ComponentPresentations)
    {
    //查找链接到此组件架构的所有组件模板
    Schema Schema=cp.Component.Schema;
    foreach(schema.GetUsingItems(过滤器)中的组件模板ct)
    {
    如果(!ct.Id.Equals(cp.ComponentTemplate.Id))
    {
    如果(ct.ISrepositoryPublishing)
    {
    添加(新的ResolvedItem(cp.Component,ct));
    }
    }
    }
    }
    }
    }
    }
    }
    
    您现在需要将其添加到GAC并修改[Tridion]\Config\Tridion.ContentManager.Config,以便在每次解析操作后(在每个项类型的解析/映射下)调用此解析器