插件提供扩展机制
补丁号:COSMIC.V4.0.004_0729
### 背景说明
- 标准插件被二开禁用导致功能出错或者相应功能无法得到升级修复;
- 插件粒度太大,二开想要重写标准插件的某个事件需要将插件整个重写。
### 作用范围
插件代理FormViewPluginProxy及其继承类,包括表单、单据、报表、列表、基础资料等;模型事件插件代理ModelEventProxy以及服务插件代理OperationServicePlugInProxy。
### 功能说明
- 注解模型
不同于以往的设计,首次采用注解实现。核心类注解PluginOverride作用于类上,其写法如下:`@PluginOverride(@PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed,parameterTypes=BeforeClosedEvent.class))`
将以上注解放在插件类上,表示此插件禁用StandardPlugin的beforeClosed事件方法,即StandardPlugin的beforeClosed事件方法将不会再执行。
- 注意
1. PluginMethod只能支持标准事件方法,不支持私有方法或自定义方法。可以理解为支持仅限表单插件基类AbstractFormPlugin等的Public方法。
2. PluginOverride必须包含成员属性PluginMethod并需指定methodName方法名,其写法为类全路径名+方法名,为唯一区分方法有时还需指定parameterTypes参数类型,多个参数用逗号分隔。
3. PluginOverride支持指定多个方法;当方法在类中唯一确定时则无需指定parameterTypes,如:
`@PluginOverride({@PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed,parameterTypes=BeforeClosedEvent.class),
@PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.itemClick)
})`
4. 另被扩展的插件可通过@Plugin、@PluginMethod注解的overrideIgnore属性指定为true则表面此方法无法被扩展(即使用PluginOverride注解对其失效)。
### 代码示例1
StandardPlugin.java
```java
import kd.bos.entity.plugin.annotation.Plugin;
import kd.bos.form.events.BeforeClosedEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
public class StandardPlugin extends AbstractFormPlugin {
@Override
public void beforeClosed(BeforeClosedEvent e) {
e.setCheckDataChange(false);
this.getView().showMessage("Hello");
}
}
```
ExtendPlugin.java
```java
import kd.bos.entity.plugin.annotation.Plugin;
import kd.bos.entity.plugin.annotation.PluginMethod;
import kd.bos.entity.plugin.annotation.PluginOverride;
import kd.bos.form.events.BeforeClosedEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
@PluginOverride(@PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed", parameterTypes = BeforeClosedEvent.class))
public class ExtendPlugin extends AbstractFormPlugin {
@Override
public void beforeClosed(BeforeClosedEvent e) {
e.setCheckDataChange(false);
this.getView().showMessage("World");
}
}
```
### 示例说明1:
1. StandardPlugin模拟标准业务插件实现了beforeClosed事件,表示退出时弹出Hello提示;
2. ExtendPlugin是二开扩展插件使用PluginOverride扩展了StandardPlugin的beforeClosed使其不执行,并重写了beforeClosed(非必须)。以上,此单表现就为退出弹出world提示。
### 代码示例2
StandardPlugin2.java
```java
import kd.bos.entity.plugin.annotation.Plugin;
import kd.bos.entity.plugin.annotation.PluginMethod;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.BeforeClosedEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import java.util.EventObject;
public class StandardPlugin2 extends AbstractFormPlugin {
@Override
public void registerListener(EventObject e) {
this.addItemClickListeners("tbmain");
}
@Override
@PluginMethod(overrideIgnore = true)
public void beforeClosed(BeforeClosedEvent e) {
e.setCheckDataChange(false);
this.getView().showMessage("Hello2");
}
@Override
public void itemClick(ItemClickEvent evt) {
if("baritemap".equals(evt.getItemKey())) {
Integer v = (Integer) this.getModel().getValue("integerfield");
this.getModel().setValue("integerfield", v + 1);
}
}
}
```
ExtendPlugin2.java
```java
import kd.bos.entity.plugin.annotation.Plugin;
import kd.bos.entity.plugin.annotation.PluginMethod;
import kd.bos.entity.plugin.annotation.PluginOverride;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.BeforeClosedEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.form.plugin.FormViewPluginProxy;
import kd.bos.form.plugin.IFormPlugin;
import java.util.EventObject;
@Plugin(name = "扩展插件2", description = "这是一个业务扩展插件,重写了beforeClosed与itemClick事件。")
@PluginOverride({@PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin2.beforeClosed", parameterTypes = BeforeClosedEvent.class),
@PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin2.itemClick")
})
public class ExtendPlugin2 extends AbstractFormPlugin {
@Override
public void registerListener(EventObject e) {
this.addItemClickListeners("tbmain");
}
@Override
public void beforeClosed(BeforeClosedEvent e) {
e.setCheckDataChange(false);
this.getView().showMessage("World2");
}
@Override
public void itemClick(ItemClickEvent evt) {
if("baritemap".equals(evt.getItemKey())) {
//替换插件方法
this.getView().showMessage("整数+1");
//调用原插件方法
FormViewPluginProxy formViewPluginProxy = this.getView().getService(FormViewPluginProxy.class);
IFormPlugin plugin = formViewPluginProxy.getPlugin("kd.bos.plugin.override.form.demo.StandardPlugin2");
plugin.itemClick(evt);
}
}
}
```
### 示例说明2
1. StandardPlugin模拟标准业务插件分别实现itemClick、beforeClosed,beforeClosed事件使用了PluginMethod的overrideIgnore属性为true表明其不可重写;itemClick事件则为表单上的整数字段为其每次点击都自增1;
2. ExtendPlugin2是二开扩展插件使用PluginOverride扩展了StandardPlugin的beforeClosed、itemClick事件,但由于原插件overrideIgnore=true重写并不会生效。 同时,itemClick事件被重写成功并调用原插件的方法。其表现为自增1的同时弹出整数+1的提示。
插件提供扩展机制
补丁号:COSMIC.V4.0.004_0729### 背景说明- 标准插件被二开禁用导致功能出错或者相应功能无法得到升级修复;- 插件粒度太大,二开想要...
点击下载文档
上一篇:列表合计和排序优化下一篇:上传图片时会自动压缩图片大小
本文2024-09-23 00:22:49发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139092.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章