PXM . , Mark Demeny Sitecore, . , .
item:
Sitecore: , InDesign , , , , .
SaveProcessor.cs
public class SaveProcessor
{
private Template _StandardTemplate;
private const string PRINT_STUDIO_SITE_NAME = "printstudio";
private static readonly List<Guid> _ActiveItemIds = new List<Guid>();
public void OnItemSaving(object sender, EventArgs args)
{
if (Context.Site.Name.Equals(PRINT_STUDIO_SITE_NAME))
{
var sitecoreEventArgs = args as SitecoreEventArgs;
var updatedItem = sitecoreEventArgs?.Parameters[0] as Item;
if (updatedItem != null)
{
if (!_ActiveItemIds.Contains(updatedItem.ID.Guid))
{
var originalItem = Context.Database.GetItem(updatedItem.ID);
if (originalItem != null)
{
var workflow = Context.Database.WorkflowProvider.GetWorkflow(originalItem);
var workflowState = workflow?.GetState(originalItem);
if (workflowState != null && workflowState.FinalState)
{
var differences = new Dictionary<string, string>();
foreach (Field field in updatedItem.Fields)
{
var updatedItemField = updatedItem.Fields[field.ID];
var originalItemField = originalItem.Fields[field.ID];
if (updatedItemField != null &&
!IsStandardField(updatedItemField) &&
originalItemField != null &&
!updatedItemField.Value.Equals(originalItemField.Value))
{
differences.Add(field.Name, updatedItemField.Value);
}
}
if (differences.Count > 0)
{
_ActiveItemIds.Add(updatedItem.ID.Guid);
try
{
originalItem.Editing.BeginEdit();
var newVersion = originalItem.Versions.AddVersion();
newVersion.Editing.BeginEdit();
foreach (var difference in differences)
{
newVersion[difference.Key] = difference.Value;
}
newVersion.Editing.EndEdit();
originalItem.Editing.EndEdit();
}
finally
{
_ActiveItemIds.Remove(updatedItem.ID.Guid);
}
sitecoreEventArgs.Result.Cancel = true;
}
}
}
}
}
}
}
public bool IsStandardField(Field field)
{
if (_StandardTemplate == null)
_StandardTemplate = TemplateManager.GetTemplate(Sitecore.Configuration.Settings.DefaultBaseTemplate, field.Database);
return _StandardTemplate.ContainsField(field.ID);
}
}
web.config, .
App_Config\Include\SaveProcessor.config
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<events>
<event name="item:saving">
<handler type="TestPxm.Pxm.SaveProcessor,TestPxm" method="OnItemSaving" patch:before="handler[@type='Sitecore.Tasks.ItemEventHandler, Sitecore.Kernel']"/>
</event>
</events>
</sitecore>
</configuration>