根据您要实现的功能,可能需要在 Limyee 电商平台的前端 UI 中公开上下文管理选项。上下文管理 UI 完全由插件定义,因此易于添加。
上下文管理 UI 扩展的类型
上下文管理 UI 通过前端页面左上角的齿轮图标(当有可用的上下文管理面板时可见)使用。通过当前活动的 URL 路由页面上下文提供的数据,上下文管理 UI 可查看与页面相关的上下文数据 。上下文管理 UI 将标识与容器、应用程序和主题相关的面板。此外,面板可用于临时上下文(例如,对任何页面上可能存在的内容执行管理或审核操作)。
上下文管理 UI 支持以下面板类型:
- 容器面板:在当前上下文存在匹配的容器类型时,将显示容器面板。有关容器的详细信息,请参阅内容模型。
- 应用程序面板:在当前上下文存在匹配的应用程序类型时,将显示应用程序面板。有关应用程序的详细信息,请参阅内容模型。
- 主题面板:主题面板针显示给当前上下文主题。有关主题的详细信息,请参阅主题。
- 显式面板:显式面板不包括在上下文面板 UI 的可浏览导航中,而是一种可从任何上下文访问管理功能的面板。显式面板通过其 URL 直接打开。
容器面板
要为一个或多个容器类型添加上下文管理面板,必须定义并启用实现 IContainerPanel 接口的插件。IContainerPanel 接口在 Limyee.Core.dll 的 Limyee.Extensibility.Administration.Version1 命名空间中定义。下面的示例创建一个名为“容器面板示例”的容器面板:
using System; using Limyee.Extensibility; using Limyee.Extensibility.Administration.Version1; namespace Samples { public class SampleContainerPanel : IContainerPanel { private readonly Guid _id = new Guid("755E3CE9-0321-4B5D-B31D-CC1A800A9AAF"); #region IPlugin public string Name => "容器面板示例"; public string Description => ""; public void Initialize() { } #endregion #region IContainerPanel public Guid[] ContainerTypes { get { var groupsApi = Apis.Get<Limyee.Extensibility.Api.Version1.IGroups>(); if (groupsApi != null) return new Guid[] { groupsApi.ContainerTypeId }; else return new Guid[0]; } } public string CssClass { get { return string.Empty; } } public int? DisplayOrder { get { return null; } } public bool IsCacheable { get { return true; } } public Guid PanelId { get { return _id; } } public bool VaryCacheByUser { get { return false; } } public bool HasAccess(int userId, Guid containerType, Guid containerId) { return true; } public string GetPanelName(Guid containerType, Guid containerId) { return ""; } public string GetPanelDescription(Guid containerType, Guid containerId) { return "容器面板的示例。"; } public string GetViewHtml(Guid containerType, Guid containerId) { return "这是容器面板示例的内容。"; } #endregion } }
ContainerTypes 属性标识此上下文管理面板应用的容器类型。在示例中,我们引用了群组的 ContainerTypeId。这将引起此面板向查看与群组相关页面的用户公开。可以自定义 HasAccess() 方法,以将对面板的访问限制为仅拥有特定权限的用户或仅有特定配置的容器。GetPanelName() 返回面板的名称,GetPanelDescription() 返回面板的描述,如 UI 中的面板列表所示。GetViewHtml() 返回面板的内容。GetPanelName()、GetPanelDescription() 和 GetViewHtml() 通常由插件定义的小组件渲染,但也可以像本示例中那样直接生成代码。
部署并启用后,示例将显示在上下文管理 UI 的“管理群组”菜单中:
从“管理群组”菜单中选择容器面板示例将呈现如下面板:
应用面板
要为一个或多个应用程序类型添加上下文管理面板,必须定义并实现 IApplicationPanel 接口的插件。IApplicationPanel 接口在 Limyee.Core.dll 的 Limyee.Extensibility.Administration.Version1 命名空间中定义。下面的示例创建一个名为“应用程序面板示例”的应用程序面板:
using System; using Limyee.Extensibility; using Limyee.Extensibility.Administration.Version1; namespace Samples { public class SampleApplicationPanel : IApplicationPanel { private readonly Guid _id = new Guid("EAFBE777-7E3B-4B18-8E9B-EBE89E673619"); #region IPlugin public string Name => "应用程序面板示例"; public string Description => ""; public void Initialize() { } #endregion #region IApplicationPanel public Guid[] ApplicationTypes { get { var storesApi = Apis.Get<Limyee.Extensibility.Api.Version1.IStores>(); if (storesApi != null) return new Guid[] { storesApi.ApplicationTypeId }; else return new Guid[0]; } } public string CssClass { get { return string.Empty; } } public int? DisplayOrder { get { return null; } } public bool IsCacheable { get { return true; } } public Guid PanelId { get { return _id; } } public bool VaryCacheByUser { get { return false; } } public bool HasAccess(int userId, Guid containerType, Guid containerId) { return true; } public string GetPanelName(Guid applicationType, Guid applicationId) { return "应用程序面板示例"; } public string GetPanelDescription(Guid applicationType, Guid applicationId) { return "应用程序面板的示例。"; } public string GetViewHtml(Guid applicationType, Guid applicationId) { return "这是应用程序面板示例的内容。"; } #endregion } }
ApplicationTypes 属性标识此上下文管理面板应用的应用程序类型。在示例中,我们引用了商店的 ApplicationTypeId。这将引起此面板向查看与商店相关的页面的用户公开。可以自定义 HasAccess() 方法,以将对面板的访问限制为仅拥有特定权限的用户或有特定配置的应用程序。GetPanelName() 返回面板的名称,GetPanelDescription() 返回面板的描述,如 UI 中的面板列表所示。GetViewHtml() 返回面板的内容。GetPanelName()、GetPanelDescription() 和 GetViewHtml() 通常由插件定义的小组件渲染,但也可以像本示例中那样直接生成代码。
部署并启用后,该示例将显示在上下文管理 UI 的“管理商店”菜单中:
从“管理商店”菜单中选择应用程序面板示例将呈现如下面板:
主题面板
要为主题添加上下文管理面板,必须定义并实现 IThemePanel 接口的插件。IThemePanel 接口在 Limyee.Core.dll 的 Limyee.Extensibility.Administration.Version1 命名空间中定义。下面的示例创建一个名为“主题面板示例”的主题面板:
using System; using Limyee.Extensibility; using Limyee.Extensibility.Administration.Version1; namespace Samples { public class SampleThemePanel : IThemePanel { private readonly Guid _id = new Guid("815DC43E-D0AC-4B62-B54D-4755E880FEBB"); #region IPlugin public string Name => "主题面板示例"; public string Description => ""; public void Initialize() { } #endregion #region IThemePanel public string CssClass { get { return string.Empty; } } public int? DisplayOrder { get { return null; } } public bool IsCacheable { get { return true; } } public Guid PanelId { get { return _id; } } public bool VaryCacheByUser { get { return false; } } public bool HasAccess(int userId, Guid themeType, Guid themeApplicationId, bool forceDefault) { return true; } public string GetPanelName(Guid themeType, Guid themeApplicationId, bool forceDefault) { return "主题面板示例"; } public string GetPanelDescription(Guid themeType, Guid themeApplicationId, bool forceDefault) { return "主题面板的示例。"; } public string GetViewHtml(Guid themeType, Guid themeApplicationId, bool forceDefault) { return "这是主题面板示例的内容。"; } #endregion } }
每当用户处于他们可以管理的主题上下文中时,此面板都将可用。可以自定义 HasAccess() 方法,可以对面板的访问限制为仅拥有特定权限的用户或仅有特定配置的主题。GetPanelName() 返回面板的名称,GetPanelDescription() 返回面板的描述,如 UI 中的面板列表所示。GetViewHtml() 返回面板的内容。GetPanelName()、GetPanelDescription() 和 GetViewHtml() 通常由插件定义的小组件渲染,但也可以像本示例中那样直接生成代码。
部署并启用后,该示例将显示在上下文管理 UI 的“管理 [主题类型] 主题”菜单中,例如“管理商店主题”:
从“管理商店主题”菜单中选择主题面板示例将呈现如下面板:
显式面板
要创建可在任何上下文中使用或可由其他上下文管理面板重用的上下文管理面板,可以定义显式面板。显式管理面板不存在与上下文管理 UI 的可浏览层次结构中,可以直接通过 URL 从前端的 UI 小组件或其他上下文管理面板打开。要添加显式面板,可以定义并启用实现 IExplicitPanel 接口的插件。IExplicitPanel 接口在 Limyee.Core.dll 的 Limyee.Extensibility.Administration.Version1 命名空间中定义。示例实现如下:
using System;
using System.Collections.Specialized;
using Limyee.Extensibility.Administration.Version1;
namespace Samples
{
public class SampleExplicitPanel : IExplicitPanel
{
private readonly Guid _id = new Guid("6574E424-8E93-45EB-90F5-9A57AA4BE635");
private IExplicitPanelController _explictPanelController;
#region IPlugin
public string Name => "显式面板示例";
public string Description => "";
public void Initialize() { }
#endregion
#region IExplicitPanel
public void SetController(IExplicitPanelController controller)
{
_explictPanelController = controller;
}
public string CssClass { get { return string.Empty; } }
public int? DisplayOrder { get { return null; } }
public bool IsCacheable { get { return true; } }
public Guid PanelId { get { return _id; } }
public bool VaryCacheByUser { get { return false; } }
public bool HasAccess(int userId, NameValueCollection parameters)
{
return true;
}
public string GetPanelName(NameValueCollection parameters)
{
return "显式面板示例";
}
public string GetPanelDescription(NameValueCollection parameters)
{
return "显式面板的示例。";
}
public string GetViewHtml(NameValueCollection parameters)
{
return "显式面板示例的内容。";
}
#endregion
}
}
显式面板通过 SetController() 方法随控制器一起提供。此控制器提供了一种方法来生成此面板的 URL(带或不带参数)。然后,可以将此 URL 提供给其他面板,以使它们能够生成指向此显式面板的链接并共享其功能。HasAccess() 方法可用于限制特定用户访问显式面板。GetPanelName()、GetPanelDescription() 和 GetViewHtml() 的工作方式与其他上下文面板(见上文)类似,但可由加载面板的原始 URL 传递可选参数(如果已定义)。此示例面板在部署且访问其 URL 时呈现为:
请注意,始终显示“返回(或上一级面板名称)”链接。如果从上下文管理面板打开,“返回”按钮将返回到上一个面板。如果直接从前端的 UI 或直接链接打开,则“返回”按钮将关闭上下文管理 UI 并返回到页面的完整视图。