动态显示在动态流中,并为用户提供了一种与平台保持互动的简便方法。
为什么要创建动态?
在对提供动态的平台执行操作时,用户将允许其他用户一目了然地查看相关活动。一个很好的例子是,当用户将事件添加到日历时,动态可以为用户提供有关事件的信息,而无需导航到日历。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
}
}
});
}
下面是动态在活动流中的外观示例。(在管理 > 动态 > 动态类型中启用。)