我想更新分配到每个页面项目中的占位符(PH)键的值。
问题是我在主模板中更改了PH键的值(实际上将两个模板合并为一个模板),并且应该使用新分配的PH键更新一些页面。
如何更新占位符键而不单击每个项目并更改演示文稿中的值?如果我这样做,则需要花费很多时间。
我想在节目中做的是:
答案 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);
}
}
}