插件可以选择公开平台在管理界面中显示的配置选项。
何时应公开配置选项?
在开发基于配置值(例如,全局选项或身份验证详细信息)的插件时,您可以实现可配置的插件,以便通过管理界面轻松公开这些选项。
创建可配置的插件
要向现有插件添加配置选项,插件必须实现 IConfigurablePlugin 接口。IConfigurablePlugin 接口在 Limyee.Components.dll 的 Limyee.Extensibility.Version1 命名空间中定义。IConfigurablePlugin 接口有两个成员:要公开的配置选项由 ConfigurationOptions 属性标识,当前配置数据将提供给 Update 方法。配置选项是使用 Dynamic Configuration 定义的,它是与小组件共享实现,可以基于元数据自动生成表单。示例如下:
using Limyee.DynamicConfiguration.Components;
using Limyee.Extensibility.Version1;
namespace Samples
{
public class SampleConfigurablePlugin : IConfigurablePlugin
{
private IPluginConfiguration _configuration;
#region IPlugin
public string Name => "可配置插件示例";
public string Description => "";
public void Initialize() { }
#endregion
#region IConfigurablePlugin
public PropertyGroup[] ConfigurationOptions
{
get
{
var group = new PropertyGroup("options", "选项", 0);
var stringProperty = new Property("stringProperty", "字符串属性示例", PropertyType.String, 0, "这是默认值")
{
DescriptionText = "字符串属性描述示例"
};
group.Properties.Add(stringProperty);
var selectableProperty = new Property("selectableProperty", "可选属性示例", PropertyType.String, 1, "One")
{
DescriptionText = "可选属性描述示例"
};
selectableProperty.SelectableValues.Add(new PropertyValue("One", "选择一", 1));
selectableProperty.SelectableValues.Add(new PropertyValue("Two", "选择二", 2));
selectableProperty.SelectableValues.Add(new PropertyValue("Three", "选择三", 3));
selectableProperty.SelectableValues.Add(new PropertyValue("Four", "选择四", 4));
group.Properties.Add(selectableProperty);
return new[] { group };
}
}
public void Update(IPluginConfiguration configuration)
{
_configuration = configuration;
}
#endregion
}
}
在此示例中,将两个属性添加到配置选项定义名为“选项”的组中。第一个属性称为“字符串属性示例”,表示一个字符串值。第二个属性“可选属性示例”也是一个字符串值,但它定义了可选选项,这些选项将此字段显示为下拉列表。在管理界面中部署和查看此插件时,它将显示为:
Update 方法根据 ConfigurationOptions 定义的元数据接收插件的配置数据。然后,该插件可以读取和使用此配置数据,来适合实现其行为。IPluginConfiguration 的 Update 方法提供了包括获取和设置插件配置值的方法。例如,要读取示例定义的第一个字符串属性的当前值,插件将调用:
var stringValue = _configuration.GetString("stringProperty");
定义配置元数据时,将使用 Limyee.DynamicConfiguration.DynamicConfiguration.dll 中 Limyee.DynamicConfiguration.Components 命名空间中的项。这些包括:
当使用动态配置属性实例定义配置元数据时,Limyee 电商平台将为除自定义之外的每种数据类型显示默认编辑器。若要自定义值编辑器的显示,可以将属性的 ControlType 属性设置为实现 IPropertyControl 的类的类型。Limyee 电商平台包括一些可由插件和小组件使用的属性控件:
通常,插件要运行必需将配置值填上。在这些情况下,在充分指定配置之前不允许插件运行是很重要的。此方案是通过实现 Limyee.Components.dll 中定义的 IRequiredConfigurationPlugin 接口来实现的。此接口添加了一个属性 IsConfigured,平台读取该属性以确定插件在允许主动启用之前是否配置了该插件。如果启用了插件,但配置不令人满意,则该插件将在管理界面中以红色突出显示,并且不会主动启用(即不会完全初始化,因此将无法与平台交互)。基于前面的可配置插件示例的实现如下:
using Limyee.DynamicConfiguration.Components;
using Limyee.Extensibility.Version1;
namespace Samples
{
public class SampleConfigurablePlugin : IConfigurablePlugin, IRequiredConfigurationPlugin
{
private IPluginConfiguration _configuration;
#region IPlugin
public string Name => "可配置插件示例";
public string Description => "";
public void Initialize() { }
#endregion
#region IConfigurablePlugin
public PropertyGroup[] ConfigurationOptions
{
get
{
var group = new PropertyGroup("options", "选项", 0);
var stringProperty = new Property("stringProperty", "字符串属性示例", PropertyType.String, 0, "这是默认值")
{
DescriptionText = "字符串属性描述示例"
};
group.Properties.Add(stringProperty);
var selectableProperty = new Property("selectableProperty", "可选属性示例", PropertyType.String, 1, "One")
{
DescriptionText = "可选属性描述示例"
};
selectableProperty.SelectableValues.Add(new PropertyValue("One", "选择一", 1));
selectableProperty.SelectableValues.Add(new PropertyValue("Two", "选择二", 2));
selectableProperty.SelectableValues.Add(new PropertyValue("Three", "选择三", 3));
selectableProperty.SelectableValues.Add(new PropertyValue("Four", "选择四", 4));
group.Properties.Add(selectableProperty);
return new[] { group };
}
}
public void Update(IPluginConfiguration configuration)
{
_configuration = configuration;
}
#endregion
#region IRequiredConfigurationPlugin
public bool IsConfigured
{
get { return _configuration.GetString("stringProperty") == "有效"; }
}
#endregion
}
}
在此示例实现中,仅当“stringProperty”配置字段的值为“有效”时,才接受配置。当插件已启用且值不为“有效”时,该插件将在列表中以红色背景显示:
当它具有有效值时,它将正常列出(并完全启用/初始化):
虽然 Limyee 电商平台将实现了 IConfigurablePlugin 的插件公开其配置选项和自动生成配置表单,并处理将自定义属性控件用于单个字段的情况,但有时整个配置界面需要使用自定义布局和实现。为了能够完全覆盖配置界面,插件可以从 Limyee.Components.dll 的 Limyee.Extensibility.Version1 命名空间实现 IRenderableConfigurablePlugin 接口。此接口添加了一个方法 GetConfigurationHtml,该方法需要一个可以插入到插件编辑界面中的 HTML 结果。例如
using Limyee.DynamicConfiguration.Components;
using Limyee.Extensibility.Version1;
namespace Samples
{
public class SampleConfigurablePlugin : IConfigurablePlugin, IRequiredConfigurationPlugin, IRenderableConfigurablePlugin
{
private IPluginConfiguration _configuration;
#region IPlugin
public string Name => "可配置插件示例";
public string Description => "";
public void Initialize() { }
#endregion
#region IConfigurablePlugin
public PropertyGroup[] ConfigurationOptions
{
get
{
var group = new PropertyGroup("options", "选项", 0);
var stringProperty = new Property("stringProperty", "字符串属性示例", PropertyType.String, 0, "这是默认值")
{
DescriptionText = "字符串属性描述示例"
};
group.Properties.Add(stringProperty);
var selectableProperty = new Property("selectableProperty", "可选属性示例", PropertyType.String, 1, "One")
{
DescriptionText = "可选属性描述示例"
};
selectableProperty.SelectableValues.Add(new PropertyValue("One", "选择一", 1));
selectableProperty.SelectableValues.Add(new PropertyValue("Two", "选择二", 2));
selectableProperty.SelectableValues.Add(new PropertyValue("Three", "选择三", 3));
selectableProperty.SelectableValues.Add(new PropertyValue("Four", "选择四", 4));
group.Properties.Add(selectableProperty);
return new[] { group };
}
}
public void Update(IPluginConfiguration configuration)
{
_configuration = configuration;
}
#endregion
#region IRequiredConfigurationPlugin
public bool IsConfigured
{
get { return _configuration.GetString("stringProperty") == "有效"; }
}
#endregion
#region IRenderableConfigurable
public string GetConfigurationHtml(string apiJson)
{
return string.Format(@"
<div id=""sample-configurable-plugin-editor"">
这是个<strong>自定义</strong>的配置界面。
</div>
<script type=""text/javascript"">
(function() {{
var api = {0};
api.registerContent([{{
name: '示例',
orderNumber: 0,
selected: function() {{ $('#sample-configurable-plugin').show(); }},
unselected: function() {{ $('#sample-configurable-plugin').hide(); }}
}}]);
}})();
</script>
",
apiJson);
}
#endregion
}
}
此示例实现是只读的,但显示为:
GetConfigurationHtml 方法提供了 JSON 格式的客户端 API,可用于与平台定义的插件编辑器界面交互和扩展。该示例注册一个名为“示例”的选项卡,但可以添加多个选项卡。
此示例不是实际示例,因为它实际上不会公开或编辑任何配置字段。通常,完整实现将使用插件定义的小组件,该小组件可以读/写插件配置值,通过将 JSON API 传递到私有小组件 API 来实现 GetConfigurationHtml。