7

我正在为一个旨在使用 Tridion 2012 UI/XM 管理页面的网站进行功能设计。页面上有 2 个区域,左侧是主要内容区域,右侧是侧边栏。理想情况下,用户应该能够将内容拖放到这些区域中。在一个理想的世界中,我想定义沿线的区域

  • 侧栏:CT 中包含文本“Right”的任何 CP。
  • 主要:所有其他CP

查看文档 ,您似乎需要明确使用 CT/Schema ID 对来定义区域。有没有可能以任何其他方式做到这一点?

至少我希望能够定义侧栏允许一组固定的 CT/Schema ID 对,但将主要区域作为一个包罗万象的存储桶。这可能吗?

侧边栏也有可能被分成 2 个区域,在广告上方和下方。两个地区都应该允许相同类型的 CP - 据我了解这是不可能的 - 这是正确的吗?有什么解决方法的想法吗?

4

2 回答 2

5

要配置采用所有内容类型的区域,您需要获取 Publication AppData 并遍历内容类型并构建您的 json 标记以启用此功能。您可以编写包含在每个页面模板上并执行此逻辑的 C# TBB,您可以定义一些CT 级别的元数据,确定它将进入哪个区域并构建区域 JSON 标记。

下面是让所有组件类型添加到一个区域的代码段。您可以通过检查模板名称来更改逻辑以使其正确。

 // get the publication from the engine -- using TemplateBase Util..

    Publication thisPub = GetPublication();

    XmlElement seAppdata = thisPub.LoadApplicationData("SiteEdit").GetAs<XmlElement>();

    XmlNamespaceManager seNsMgr = new XmlNamespaceManager(new NameTable());
    seNsMgr.AddNamespace("se", "http://www.sdltridion.com/2011/SiteEdit");
    seNsMgr.AddNamespace("xlink", "http://www.w3.org/1999/xlink");

    XmlNodeList contentTypes = (XmlNodeList)seAppdata.SelectNodes("//se:ContentTypes/se:ContentType", seNsMgr); 

    List<String> contentTypeJson = new List<String>();
    foreach (XmlNode contentType in contentTypes)
    {
        string templateId = contentType.SelectSingleNode("se:ComponentTemplate/@xlink:href", seNsMgr).Value;
        string componentId = contentType.SelectSingleNode("se:Component/@xlink:href", seNsMgr).Value;

        Component thisSchema = (Component)engine.GetObject(componentId);
        string schemaId = thisSchema.Schema.Id;

        // Add json formated string for Content Types
        contentTypeJson.Add(string.Format("{{schema: \"{0}\", template: \"{1}\"}}", schemaId, templateId));
    }

    // Final Markup - JSON
     String allRegionSeText = string.Format("<!-- Start Region: {{title: \"All Region\",  allowedComponentTypes: [{0}],  minOccurs: 1,  maxOccurs: 5 }} -->", string.Join(",", contentTypeJson.ToArray()));

     // Push to the package to use in DWT..
     package.PushItem("ALL_REGION", package.CreateStringItem(ContentType.Text, allRegionSeText));

希望这可以帮助。

于 2012-10-16T17:14:30.007 回答
1

您是否尝试过在不指定 CT/Schema 对的情况下创建区域?我记得在早期的实现中看到您可以在任何地方删除内容类型,因为没有正确配置区域(或者可能根本没有)。

于 2012-10-16T16:10:57.223 回答