Sitecore 更新占位符键(编程)

Sitecore Update Placeholder Key (Programming)

我想更新分配给每个页面项目的占位符 (PH) 键的值。

问题是我更改了主模板中的 PH 键值(实际上是将两个模板组合成一个模板),许多页面应该使用新分配的 PH 键进行更新。

如何在不单击每个项目并更改演示文稿中的值的情况下更新占位符键?如果我这样做,需要很多时间。

我想在程序中做的是:

  1. 设置初始路径(/sitecore/home/robot/)
  2. 检查初始路径中的每个项目(以及每个项目的子项目)
  3. 在演示文稿中检索每个项目的分配控件
  4. 如果有 "Breadcrumbs" 控件带有“breadcrumbs”键名
  5. 然后,将值更改为“/template/dynamic/breadcrumbs
  6. 执行直到它检索到初始路径中的所有项目

查看下面的代码。它的作用是获取所选项目的渲染引用,检查它们的占位符和渲染名称,并根据所选渲染的唯一 ID 更新所选项目 __Renderings 字段的 xml 值。然后它递归地为所有后代触发相同的代码。

此代码

  • 不更新从 __Standard Values
  • 继承的组件的占位符
  • 不会自动发布更改的项目。
  • 区分大小写
  • 要求用户对您要更改的项目具有写入权限
public void Start()
{
    string initialPath = "/sitecore/home/robot";
    Item root = Database.GetDatabase("master").GetItem(initialPath);
    UpdatePlaceholderName(root, "Breadcrumbs", "breadcrumbs", "/template/dynamic/breadcrumbs");
}

private void UpdatePlaceholderName(Item item, string componentName, string placeholderName, string newPlaceholderName)
{
    if (item != null)
    {
        List<RenderingReference> renderings = item.Visualization.GetRenderings(Sitecore.Context.Device, false)
            .Where(r => r.Placeholder == placeholderName && r.RenderingItem.Name == componentName).ToList();

        if (renderings.Any())
        {
            string renderingsXml = item["__Renderings"];
            item.Editing.BeginEdit();
            foreach (RenderingReference rendering in renderings)
            {
                string[] strings = renderingsXml.Split(new [] {"<r"}, StringSplitOptions.None);
                foreach (string renderingXml in strings)
                {
                    if (renderingXml.Contains("s:ph=\"" + placeholderName + "\"") && renderingXml.Contains("uid=\"" + rendering.UniqueId + "\""))
                    {
                        renderingsXml = renderingsXml.Replace(renderingXml, renderingXml.Replace("s:ph=\"" + placeholderName + "\"", "s:ph=\"" + newPlaceholderName + "\""));
                    }
                }
            }
            item["__Renderings"] = renderingsXml;
            item.Editing.EndEdit();
        }

        foreach (Item child in item.GetChildren())
        {
            UpdatePlaceholderName(child, componentName, placeholderName, newPlaceholderName);
        }
    }
}