Shailesh
Shailesh

Reputation: 544

Remove Rendering from Sitecore Item

I have to remove all instance of a rendering by rendering id. I tried below code but its not working.

LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]);
LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());

//Create a RenderingDefinition and add the reference of sublayout or rendering
RenderingDefinition renderingDefinition = new RenderingDefinition();
renderingDefinition.ItemID = sublayoutId;

var d = layoutDefinition.GetDevice(deviceDefinition.ID.ToString());
d.Renderings.Remove(renderingDefinition);

item.Editing.BeginEdit();
layoutField.Value = layoutDefinition.ToXml();
item.Editing.EndEdit();

I have referred:

Upvotes: 4

Views: 2209

Answers (1)

Marek Musielak
Marek Musielak

Reputation: 27132

Try code below. I haven't tested it but instead of creating a RenderingDefinition object and removing it from the list (which won't work cause it's not the same instance of the object), it filters the existing array of renderings comparing ItemId property:

LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]);
LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());

var d = layoutDefinition.GetDevice(deviceDefinition.ID.ToString());

IEnumerable<RenderingDefinition> renderingsArray = d.Renderings.ToArray().Cast<RenderingDefinition>();
d.Renderings = new ArrayList(renderingsArray.Where(r => r.ItemID != sublayoutId).ToList());

item.Editing.BeginEdit();
layoutField.Value = layoutDefinition.ToXml();
item.Editing.EndEdit();

Upvotes: 5

Related Questions