如何防止全局事件处理程序因 API 调用而触发
How to prevent global event handlers from firing caused by an API call
我有一个自定义模块,它使用 Kentico API (DocumentHelper) 更新文档的某些字段然后发布,但我不希望它触发链接到我的文档页面类型的事件处理程序.我尝试向 .Publish("admin_edit") 添加注释,希望我可以从 WorkflowEventargs 参数中捕获它,但 VersionComment 属性 始终 return 为空。有没有办法在 Kentico 中完成此操作?
更新字段:
var document = DocumentHelper.GetDocument(documentID, tree);
var workflowManager = WorkflowManager.GetInstance(tree);
var workflow = workflowManager.GetNodeWorkflow(document);
if (workflow != null)
{
document.CheckOut();
document.SetValue("SomeFIeld", "some value");
document.Update(true);
document.CheckIn();
document.Publish("admin_edit");
}
事件处理程序:
public override void Init()
{
WorkflowEvents.Publish.After += Publish_After;
}
private void Publish_After(object sender, WorkflowEventArgs e)
{
if (!string.IsNullOrEmpty(e.VersionComment) &&
e.VersionComment.Contains("admin_edit"))
return;
}
版本信息总是为空,因为这与“页面版本控制”事件有关,特别是“SaveVersion” .您可以在 link 上找到更多相关信息。如果展开 'Properties',您将看到为特定事件填充了哪些属性。在你的情况下,你可以尝试这样的事情,为上一个版本添加你的消息,然后检查关于'Publish_After'事件的评论,见下面的代码:
var document = DocumentHelper.GetDocument(documentID, tree);
var workflowManager = WorkflowManager.GetInstance(tree);
var workflow = workflowManager.GetNodeWorkflow(document);
if (workflow != null)
{
document.CheckOut();
document.SetValue("SomeFIeld", "some value");
document.Update(true);
document.CheckIn(versionComment: "admin_edit");
document.Publish();
}
然后,在事件处理程序中,获取最新版本并检查评论,如下所示:
if (e.PublishedDocument?.VersionHistory?.Count > 0)
{
var lastVersion = e.PublishedDocument.VersionHistory[0] as VersionHistoryInfo;
if (lastVersion.VersionComment.Equals("admin_edit"))
{
return;
}
}
注意: 如果您有很多并发内容编辑器,您的最后一个版本可能不是来自 API 的版本(有人更改了内容并在您的 API 调用进行更改后立即保存)。这种可能性很小,但仍然有可能。如果这是您经常使用的东西,则必须考虑到它。此代码已针对 Kentico 11.
进行测试
我有一个自定义模块,它使用 Kentico API (DocumentHelper) 更新文档的某些字段然后发布,但我不希望它触发链接到我的文档页面类型的事件处理程序.我尝试向 .Publish("admin_edit") 添加注释,希望我可以从 WorkflowEventargs 参数中捕获它,但 VersionComment 属性 始终 return 为空。有没有办法在 Kentico 中完成此操作?
更新字段:
var document = DocumentHelper.GetDocument(documentID, tree);
var workflowManager = WorkflowManager.GetInstance(tree);
var workflow = workflowManager.GetNodeWorkflow(document);
if (workflow != null)
{
document.CheckOut();
document.SetValue("SomeFIeld", "some value");
document.Update(true);
document.CheckIn();
document.Publish("admin_edit");
}
事件处理程序:
public override void Init()
{
WorkflowEvents.Publish.After += Publish_After;
}
private void Publish_After(object sender, WorkflowEventArgs e)
{
if (!string.IsNullOrEmpty(e.VersionComment) &&
e.VersionComment.Contains("admin_edit"))
return;
}
版本信息总是为空,因为这与“页面版本控制”事件有关,特别是“SaveVersion” .您可以在 link 上找到更多相关信息。如果展开 'Properties',您将看到为特定事件填充了哪些属性。在你的情况下,你可以尝试这样的事情,为上一个版本添加你的消息,然后检查关于'Publish_After'事件的评论,见下面的代码:
var document = DocumentHelper.GetDocument(documentID, tree);
var workflowManager = WorkflowManager.GetInstance(tree);
var workflow = workflowManager.GetNodeWorkflow(document);
if (workflow != null)
{
document.CheckOut();
document.SetValue("SomeFIeld", "some value");
document.Update(true);
document.CheckIn(versionComment: "admin_edit");
document.Publish();
}
然后,在事件处理程序中,获取最新版本并检查评论,如下所示:
if (e.PublishedDocument?.VersionHistory?.Count > 0)
{
var lastVersion = e.PublishedDocument.VersionHistory[0] as VersionHistoryInfo;
if (lastVersion.VersionComment.Equals("admin_edit"))
{
return;
}
}
注意: 如果您有很多并发内容编辑器,您的最后一个版本可能不是来自 API 的版本(有人更改了内容并在您的 API 调用进行更改后立即保存)。这种可能性很小,但仍然有可能。如果这是您经常使用的东西,则必须考虑到它。此代码已针对 Kentico 11.
进行测试