如何在Experience Manager中限制给定页面类型的内容类型

时间:2013-01-24 04:10:53

标签: tridion tridion-2011

体验管理器(XPM)(SDL Tridion 2011 SP1的用户界面更新)使管理员可以创建页面类型,其中包含与页面类似的组件演示,还可以添加有关如何创建和允许其他内容类型的规则。

对于给定的网页类型,我希望通过限制内容类型选项来简化作者的选项。

我知道我们可以:

  • 限制内容类型,以便对于给定的网页类型,作者只能创建某些predefined content types
  • 在信息中心中,完全将上述内容限制为仅预定义的内容类型,取消选择Content Types Already Used on the Page
  • 使用regions指定架构和模板的组合以及数量限制。作者只能将某些类型和数量的组件添加(拖放)到这些区域。例如,我们可以在Staging上输出以下内容来创建区域:
<div>
<!-- Start Region: {
  title: "Promos",
  allowedComponentTypes: [
    {
      schema: "tcm:2-42-8",
      template: "tcm:2-43-32"
    },
  ],
  minOccurs: 1,
  maxOccurs: 3
} -->
<!-- place the matching CPs here with template logic (e.g. TemplateBeginRepeat/ TemplateBeginIf with DWT) -->
</div>
  • 作者可能仍然看到他们可能要插入的组件(下图),但如果区域控制了允许的内容,则无法添加它们
  • 但是,文件夹权限可以减少作者在插入内容库中可以看到/使用的组件

Insert Content

我得到了所有这些吗? XPM功能中的任何其他方式或可能的扩展考虑如何限制给定页面类型的允许内容?

1 个答案:

答案 0 :(得分:4)

Alvin,你几乎提供了你问题中的大部分选项。另一种选择,如果需要自定义错误消息或甚至更精细的控制级别,则使用事件系统。订阅页面的保存事件启动阶段并编写一些验证代码,如果页面上有不需要的组件表示,则抛出异常。

由于页面类型实际上是页面模板,页面上的任何元数据和页面上的组件表示类型的组合,我们需要检查我们是否正在处理所需的页面类型以及是否遇到CP与我们想要的不匹配,我们可以简单地抛出异常。这是一些快速代码:

[TcmExtension("Page Save Events")]
public class PageSaveEvents : TcmExtension
{
    public PageSaveEvents()
    {
        EventSystem.Subscribe<Page, SaveEventArgs>(ValidateAllowedContentTypes, EventPhases.Initiated);
    }

    public void ValidateAllowedContentTypes(Page p, SaveEventArgs args, EventPhases phases)
    {
        if (p.PageTemplate.Title != "My allowed page template" && p.MetadataSchema.Title != "My allowed page metadata schema")
        {
            if (!ValidateAllowedContentTypes(p))
            {
                throw new Exception("Content Type not allowed on a page of this type.");
            } 
        }
    }

    private bool ValidateAllowedContentTypes(Page p)
    {
        string ALLOWED_SCHEMAS = "My Allowed Schema A; My Allowed Schema B; My Allowed Schema C; etc";  //to-do put these in a parameter schema on the page template
        string ALLOWED_COMPONENT_TEMPLATES = "My Allowed Template 1; My Allowed Template 2; My Allowed Template 3; etc"; //to-do put these in a parameter schema on the page template

        bool ok = true;
        foreach (ComponentPresentation cp in p.ComponentPresentations)
        {
            if (!(ALLOWED_SCHEMAS.Contains(cp.Component.Schema.Title) && ALLOWED_COMPONENT_TEMPLATES.Contains(cp.ComponentTemplate.Title)))
            {
                ok = false;
                break;
            }
        }

        return ok;
    }
}