6

Experience Manager (XPM)(SDL Tridion 2011 SP1 的用户界面更新)允许管理员创建页面类型,这些页面类型具有与页面一样的组件表示,但还添加了有关如何创建和允许其他内容类型的规则。

对于给定的页面类型,我想通过限制内容类型选择来简化作者的选择。

我知道我们可以:

  • 限制内容类型,这样对于给定的页面类型,作者只能创建某些预定义的内容类型。
  • 在仪表板中,通过取消选择将上述内容完全限制为仅预定义的内容类型Content Types Already Used on the Page
  • 使用指定模式和模板组合以及数量限制的区域。作者只能向这些区域添加(拖放)某些类型和数量的组件。例如,我们可以输出以下内容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>
  • 作者可能仍会看到他们可能想要插入的组件(下图),但如果区域控制允许的内容,则无法添加它们
  • 但是,文件夹权限会减少作者在插入内容库中可以看到/使用的组件

插入内容

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

4

1 回答 1

4

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

由于页面类型实际上是页面模板、页面上的任何元数据以及页面上的组件演示类型的组合,因此我们需要检查我们是否正在处理想要的页面类型,如果遇到不符合要求的 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;
    }
}
于 2013-01-24T05:30:52.860 回答