我在 Orchard CMS 上找不到太多帮助,最终自己找到了解决方案。不过,我花了很多时间才完成这件事。
我发现的第一件事是Orchard.Workflows.Activities
有一个文件ContentActivity
。在这个文件中还有其他类继承了ContentActivity
class ContentCreatedActivity
, ContentUpdatedActivity
and ContentPublishedActivity
。所有这些课程都是订阅的活动ContentActivity
这是一个事件活动。他们订阅 Orchard 核心的创建、更新和发布事件。
如果你调查Orchard.ContentManagement.Handlers.ContentHandler
您会看到 Orchard CMS 核心提供的默认事件列表。
我感兴趣的是OnUnpublished
事件,因此在我的模块中我创建了一个处理程序来侦听该事件。
using System.Collections.Generic;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.Workflows.Services;
namespace MyModule.Handlers {
public class WorkflowContentHandler : ContentHandler {
public WorkflowContentHandler(IWorkflowManager workflowManager) {
OnUnpublished<ContentPart>(
(context, part) =>
workflowManager.TriggerEvent("ContentUnpublished",
context.ContentItem,
() => new Dictionary<string, object> { {
"Content", context.ContentItem } }));
}
}
}
之后,我们为“未发布”创建自定义工作流程活动。这个类继承自ContentActivity
像它的兄弟姐妹一样,因此它可以启动工作流程并且将成为一个事件。
using System;
using System.Collections.Generic;
using System.Linq;
using Orchard.Localization;
using Orchard.Workflows.Models;
using Orchard.Workflows.Services;
using Orchard.Workflows.Activities;
namespace MyModule.WorkFlow
{
public class ContentUnpublishedActivity : ContentActivity
{
public override string Name
{
get { return "ContentUnpublished"; }
}
public override LocalizedString Description
{
get { return T("Content is Unpublished."); }
}
}
}
就是这样。完成此操作后,新的Content Unpublished
活动将显示在工作流活动列表中。您可以将其与其他活动结合使用,在任何内容取消发布后执行您自己的工作流程。
我不敢相信这这么容易。我花了三天时间才弄清楚,我一直在拉扯我的头发,而我一开始并没有太多的头发。
Orchard CMS 缺乏支持和资源有时确实让我很恼火。我希望这可以帮助遇到类似问题的人节省一些时间。