using
System;
using
Sitecore;
using
Sitecore.Data;
using
Sitecore.Data.Events;
using
Sitecore.Data.Fields;
using
Sitecore.Data.Items;
using
Sitecore.Data.Managers;
using
Sitecore.Data.Templates;
using
Sitecore.Diagnostics;
using
Sitecore.Events;
using
Sitecore.Globalization;
using
Sitecore.SecurityModel;
namespace
Sitecore.Foundation.Presentation.Services
{
public
class
LayoutInheritance
{
public
void
OnItemSaving(
object
sender, EventArgs args)
{
Item item = Event.ExtractParameter(args, 0)
as
Item;
PropagateLayoutChanges(item);
}
private
void
PropagateLayoutChanges(Item item)
{
if
(StandardValuesManager.IsStandardValuesHolder(item))
{
Item oldItem = item.Database.GetItem(item.ID, item.Language, item.Version);
PropagateLayoutChangesForField(item, oldItem, FieldIDs.LayoutField);
PropagateLayoutChangesForField(item, oldItem, FieldIDs.FinalLayoutField);
}
}
private
void
PropagateLayoutChangesForField(Item item, Item oldItem, ID layoutField)
{
string
layout = item[layoutField];
string
oldLayout = oldItem[layoutField];
if
(layout != oldLayout)
{
string
delta = XmlDeltas.GetDelta(layout, oldLayout);
foreach
(Template templ
in
TemplateManager.GetTemplate(item).GetDescendants())
{
ApplyDeltaToStandardValues(templ, layoutField, delta, item.Language, item.Version, item.Database);
}
}
}
private
void
ApplyDeltaToStandardValues(Template template, ID layoutField,
string
delta, Language language, Sitecore.Data.Version version, Database database)
{
if
(template?.StandardValueHolderId != (ID)
null
)
{
try
{
Item item = ItemManager.GetItem(template.StandardValueHolderId, language, version, database, SecurityCheck.Disable);
if
(item ==
null
)
{
Log.Warn($
"Foundation.Presentation: Item is null {template.StandardValueHolderId} in database {database.Name}"
, template);
return
;
}
Field field = item.Fields[layoutField];
if
(field ==
null
)
{
Log.Warn($
"Foundation.Presentation: Field is null in item {item.ID} in database database.Name"
, item);
return
;
}
if
(!field.ContainsStandardValue)
{
string
newFieldValue = XmlDeltas.ApplyDelta(field.Value, delta);
if
(newFieldValue != field.Value)
{
using
(
new
EditContext(item))
{
LayoutField.SetFieldValue(field, newFieldValue);
}
}
}
}
catch
(Exception e)
{
Log.Info($
"Foundation.Presentation: Exception {e.Message}"
, e);
throw
;
}
}
}
}
}