体验管理器(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功能中的任何其他方式或可能的扩展考虑如何限制给定页面类型的允许内容?
答案 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;
}
}