Sitecore更新占位符键(编程)

时间:2015-01-27 20:55:37

标签: sitecore placeholder

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

问题是我在主模板中更改了PH键的值(实际上将两个模板合并为一个模板),并且应该使用新分配的PH键更新一些页面。

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

我想在节目中做的是:

  1. 设置初始路径(/ sitecore / home / robot /)
  2. 在初始路径中检查每个项目(包含每个项目的子项目)
  3. 在演示文稿中检索每个项目的指定控件
  4. 如果有"面包屑"使用" 面包屑"进行控制关键名称
  5. 然后,将值更改为" / template / dynamic / breadcrumbs "
  6. 直到它恢复初始路径中的所有项目

1 个答案:

答案 0 :(得分:1)

请参阅下面的代码。它的作用是,它根据所选渲染的唯一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);
        }
    }
}