如果要使用事件处理程序,则应考虑使用OnItemSaving
事件而不是OnItemSaved
事件。在保存项目之前,您可以遍历它的字段,以确定字段值是否已更改使用Field.IsFieldModified
单个字段的属性。否则,如果您使用OnItemSaved
处理程序,则必须检索ItemChanges
已保存项目的对象,遍历 中的字段ItemChanges
,并检查IsFieldModified
那里的属性。
这是 OnItemSaving 事件处理程序的代码:
public void OnItemSaving(object sender, EventArgs args)
{
Item item = Event.ExtractParameter(args, 0) as Item;
if (item == null)
return;
item.Fields.ReadAll();
foreach (Field field in item.Fields)
{
if (!field.IsModified) //check if the field is modified
continue;
Log.Audit(string.Format("OnItemSaving - Item field {0} was modified at: {1}, by user: {2}", field.DisplayName, item.Statistics.Updated.ToString(CultureInfo.InvariantCulture), item.Statistics.UpdatedBy), this);
}
}
尽管如此,我实际上并不建议将OnItemSaved
orOnItemSaving
事件用于您的目的。保存/保存事件由 API 引发,作为对项目执行的任何保存操作的一部分 - 无论是由 Sitecore 还是由 Sitecore 用户。因此,您可能会注意到事件正在引发,而您通常不会期望它们发生。例如,在发布过程中,执行了保存操作,因此引发了保存/保存事件。可能还有其他情况也会发生意外的保存操作。
听起来您宁愿只捕获用户保存事件?即当内容作者单击特定项目的“保存”按钮时?如果是这样,我会建议进入Sitecore.Pipelines.Save
管道。此管道仅在发生 Sitecore UI 保存事件时触发(例如单击保存按钮、Ctrl+S 热键保存等...)
要使用Sitecore.Pipelines.Save
管道,您需要为管道创建一个处理器,然后将其添加到/sitecore/process/saveUI
web.config 文件中的处理器(理想情况下,通过配置包含文件)。以下是可用于管道处理器的代码:
public class LogFieldChanges
{
public void Process(SaveArgs args)
{
foreach (var saveItem in args.Items) //loop through item(s) being saved
{
var item = Sitecore.Context.ContentDatabase.GetItem(saveItem.ID, saveItem.Language, saveItem.Version); //get the actual item being saved
if (item == null)
continue;
foreach (var saveField in saveItem.Fields) //loop through the fields being saved
{
var field = item.Fields[saveField.ID]; //retrieve the Field from the actual item
var isModified = saveField.OriginalValue != saveField.Value; //determine if the field has been modified, we only want to log modified fields
if (field == null || !isModified)
continue;
Log.Audit(string.Format("SaveUI - Item field {0} was modified at: {1}, by user: {2}", field.DisplayName, item.Statistics.Updated.ToString(CultureInfo.InvariantCulture), item.Statistics.UpdatedBy), this);
}
}
}
}
为了使此代码正常工作,在处理器之后插入您的自定义处理器非常重要Sitecore.Pipelines.Save.Save
。通过将它放在该处理器之后,您可以使用SaveField.OriginalValue
和SaveField.Value
属性来确定该字段是否已被修改。此外,通过将处理器放置在处理器之后Sitecore.Pipelines.Save.Save
,您可以使用Item.Statistics
属性来确定保存项目的时间和人员。
<sitecore>
<processors>
<saveUI>
.
.
<processor mode="on" type="Sitecore.Pipelines.Save.Save, Sitecore.Kernel" />
<!-- insert your processor after the Sitecore.Pipelines.Save.Save processor -->
<processor mode="on" type="Sitecore.Extensions.Pipelines.Save.LogFieldChanges, Sitecore.Extensions"/>
.
.
</saveUI>
</processors>
</sitecore>