东莞市连易网络科技有限公司
东莞市连易网络科技有限公司
  • 网站
  • 用户
  • 购物车
  • 购物车
  • 搜索
  • 网站
  • 用户
帮助
帮助
开发文档 创建动态
  • 用户文档
  • 开发文档
  • API文档
  • 提及
  • 标签
  • 更多
  • 取消
  • 新建
  • +开始
  • +UI 自定义
  • +外部集成
  • -插件/框架扩展
    • -插件
      • 异常和日志记录
      • 插件生命周期
      • -插件示例
        • 使用小组件从插件渲染内容
        • 公开数据给外部源
        • 公开配置选项
        • 创建动态
        • +创建自定义应用程序和内容
        • 基于模板的电子邮件
        • 处理事件
        • 处理内容中的嵌入文件
        • 定义权限
        • 扩展规则支持
        • 文件交互
        • 文件查看器
        • 注册模板令牌
        • 管理依赖关系
        • 管理物理文件存储
        • 翻译插件文本
        • 通知
    • +设置开发环境
    • +进程 API

创建动态

动态显示在动态流中,并为用户提供了一种与平台保持互动的简便方法。

为什么要创建动态?

在对提供动态的平台执行操作时,用户将允许其他用户一目了然地查看相关活动。一个很好的例子是,当用户将事件添加到日历时,动态可以为用户提供有关事件的信息,而无需导航到日历。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
            }
        }
    });
}

下面是动态在活动流中的外观示例。(在管理 > 动态 > 动态类型中启用。)

  • 分享
  • 历史
  • 更多
  • 取消
相关
推荐
Copyright © 2021 东莞市连易网络科技有限公司. All rights reserved.
Powered by Limyee Commerce System(3.0.0). © 2014 - 2025 Limyee Inc.