动态显示在动态流中,并为用户提供了一种与平台保持互动的简便方法。
为什么要创建动态?
在对提供动态的平台执行操作时,用户将允许其他用户一目了然地查看相关活动。一个很好的例子是,当用户将事件添加到日历时,动态可以为用户提供有关事件的信息,而无需导航到日历。Limyee 电商平台支持通过 IActivityStoryType 插件类型在动态流中发布动态。
创建动态类型
要添加支持创建动态,请实现 IActivityStoryType 插件接口(这需要引用Limyee.Api.dll,Limyee.Components.dll和Limyee.Core.dll)。IActivityStoryType 接口扩展了 IPlugin 以添加对动态的支持。
首先,您需要生成一个 GUID 并将其作为 StoryTypeId 返回。
public Guid StoryTypeId { get { return new Guid("ED6B73B0-D3F5-4B0E-BF76-A35F9E61C247"); } }
设置 Id 后,故事类型需要 StoryTypeName 和 StoryTypeDescription。此名称和描述用于标识动态类型,便于在用户界面中管理和配置。
public string StoryTypeName { get { return "我的动态"; } } public string StoryTypeDescription { get { return "控制“我的动态”的动态。"; } }
动态可以允许用户删除单个动态。方法接受动态 ID 和用户 ID。这些 ID 可用于查找特定动态以及用户。然后,根据您的要求返回一个布尔值,该值将标识用户是否可以删除提供的动态。在此示例中,我们验证用户是否已登录,而不是匿名用户,然后确定用户是否是动态的参与者之一。参与者可以定义为参与特定活动的一个或多个用户。
public bool CanDeleteStory(Guid storyId, int userId) { Apis.Get<EventLog>().Write("", new EventLogEntryWriteOptions()); // unregistered users cannot delete stories var user = Apis.Get<Users>().Get(new UsersGetOptions { Id = userId }); var userIsRegistered = user != null && !user.IsSystemAccount.GetValueOrDefault(false); if (!userIsRegistered) { return false; } // actors can delete var story = Apis.Get<ActivityStories>().Get(storyId); return story != null && story.Actors != null && story.Actors.ToList().Exists(actor => actor.UserId == userId); }
ContentTypeIds 属性返回与动态所属内容相关的内容类型 ID 列表(有关内容类型的更多详细信息,请参阅相关文档)。通常,它与一种内容类型相关,但可以设置为多种类型。
public Guid[] ContentTypeIds { get { return new[] { Apis.Get<Users>().ContentTypeId }; } }
在某些情况下,动态必须提供活动的摘要。通常建议将摘要限制为单个句子。这是在 GetPreviewHtml 方法中完成。
public string GetPreviewHtml(IActivityStory story, Target target) { var content = Apis.Get<Contents>().Get(story.ContentId.GetValueOrDefault(), story.ContentTypeId.GetValueOrDefault()); if (content == null) return null; return string.Format("<h3>{0}</h3>", content.HtmlName("Web")); }
动态的完整视图将通过 GetViewHtml 方法进行处理。此方法接收两个参数 IActivityStory 和 Target。IActivityStory 参数可用于检索与故事关联的内容。Target 用于构建 HTML 响应,标识呈现的内容将在的位置(如 Web、Email 或 Other),以使动态能够呈现适当的版本。
public string GetViewHtml(IActivityStory story, Target target) { var content = Apis.Get<Contents>().Get(story.ContentId.GetValueOrDefault(), story.ContentTypeId.GetValueOrDefault()); if (content == null) return null; return string.Format("<h3>{0}</h3><p用户已通过身份验证。</p>", content.HtmlName("Web")); }
平台还需要知道谁是提供动态的主要用户。此过程通过 GetPrimaryUser 方法返回。在此示例中,我们只需返回负责给定动态的最后一个 Actor。
public int? GetPrimaryUser(IActivityStory story) { if (story == null || story.Actors == null || story.Actors.Count == 0) { return null; } return story.Actors.Last().UserId; }
控制器是动态类型的最终成员。IActivityStoryController 是在 Limyee 电商平台中创建,提供更新或删除动态的功能.
private IActivityStoryController _storyController; public void SetController(IActivityStoryController controller) { _storyController = controller; }
以下是我们的示例动态类型插件的完整源代码:
using System; using System.Collections.Generic; using System.Linq; using Limyee.Api.Services; using Limyee.Extensibility; using Limyee.Extensibility.Api.Version1; using Limyee.Extensibility.Content.Version1; using ActivityStoryActor = Limyee.Extensibility.Content.Version1.ActivityStoryActor; namespace MyActivityStory { public class MyActivityStory : IActivityStoryType { public string Name { get { return "我的动态插件"; } } public string Description { get { return "此插件将演示 IActivityStoryType 的工作原理"; } } public void Initialize() { Apis.Get<Users>().Events.AfterAuthenticate += Events_AfterAuthenticate; } private void Events_AfterAuthenticate(UserAfterAuthenticateEventArgs e) { UserAuthenticatedStory(e.Id.GetValueOrDefault()); } public Guid StoryTypeId { get { return new Guid("ED6B73B0-D3F5-4B0E-BF76-A35F9E61C247"); } } public string StoryTypeName { get { return "我的动态"; } } public string StoryTypeDescription { get { return "控制“我的动态”的动态。"; } } public bool CanDeleteStory(Guid storyId, int userId) { // unregistered users cannot delete stories var user = Apis.Get<Users>().Get(new UsersGetOptions { Id = userId }); var userIsRegistered = user != null && !user.IsSystemAccount.GetValueOrDefault(false); if (!userIsRegistered) { return false; } // actors can delete var story = Apis.Get<ActivityStories>().Get(storyId); return story != null && story.Actors != null && story.Actors.ToList().Exists(actor => actor.UserId == userId); } public Guid[] ContentTypeIds { get { return new[] { Apis.Get<Users>().ContentTypeId }; } } public string GetPreviewHtml(IActivityStory story, Target target) { var content = Apis.Get<Contents>().Get(story.ContentId.GetValueOrDefault(), story.ContentTypeId.GetValueOrDefault()); if (content == null) return null; return string.Format("<h3>{0}</h3>", content.HtmlName("Web")); } public string GetViewHtml(IActivityStory story, Target target) { var content = Apis.Get<Contents>().Get(story.ContentId.GetValueOrDefault(), story.ContentTypeId.GetValueOrDefault()); if (content == null) return null; return string.Format("<h3>{0}</h3><p>用户已通过身份验证。</p>", content.HtmlName("Web")); } public int? GetPrimaryUser(IActivityStory story) { if (story == null || story.Actors == null || story.Actors.Count == 0) { return null; } return story.Actors.Last().UserId; } private IActivityStoryController _storyController; public void SetController(IActivityStoryController controller) { _storyController = controller; } public bool IsCacheable { get { return true; } } public bool VaryCacheByUser { get { return true; } } private void UserAuthenticatedStory(int userId) { var user = Apis.Get<Users>().Get(new UsersGetOptions { Id = userId }); _storyController.Create(new ActivityStoryCreateOptions { ContentId = user.ContentId, ContentTypeId = Apis.Get<Users>().ContentTypeId, LastUpdate = DateTime.UtcNow, Actors = new List<ActivityStoryActor> { new ActivityStoryActor { UserId = user.Id.GetValueOrDefault(), Verb = "Add", Date = DateTime.UtcNow } } }); } } }
使用活动情景控制器
在此示例中,我们添加了一个名为 UserAuthenticatedStory 的私有方法。当用户通过身份验证时调用它,它演示如何在动态流中创建新动态。
public void Initialize() { Apis.Get<Users>().Events.AfterAuthenticate += Events_AfterAuthenticate; } private void Events_AfterAuthenticate(UserAfterAuthenticateEventArgs e) { UserAuthenticatedStory(e.Id.GetValueOrDefault()); } . . . private void UserAuthenticatedStory(int userId) { var user = Apis.Get<Users>().Get(new UsersGetOptions { Id = userId }); _storyController.Create(new ActivityStoryCreateOptions { ContentId = user.ContentId, ContentTypeId = Apis.Get<Users>().ContentTypeId, LastUpdate = DateTime.UtcNow, Actors = new List<ActivityStoryActor> { new ActivityStoryActor { UserId = user.Id.GetValueOrDefault(), Verb = "Add", Date = DateTime.UtcNow } } }); }
下面是动态在活动流中的外观示例。(在管理 > 动态 > 动态类型中启用。)