动态注册页面插件原创
金蝶云社区-聚宝彭
聚宝彭
9人赞赏了该文章 3,347次浏览 未经作者许可,禁止转载编辑于2022年02月24日 14:38:33
summary-icon摘要由AI智能服务提供

本文描述了如何在业务开发过程中,避免扩展页面影响其他继承页面,通过动态注册插件的方式实现特定业务需求。文中以单据上币别字段为例,详细说明了如何在币别字段的F7选择事件前动态添加一个列表插件,以隐藏“使用状态”和“描述”两列,从而满足业务需求。此外,还介绍了实现过程的步骤、代码示例、实现效果及开发环境和注意事项。

关键词:列表


一、需求

在业务开发过程中,有时候需要对标准产品做一定程度的二开,但又不想扩展页面后注册插件,因为这样可能会影响很多继承/扩展自该页面的其他页面,因此我们希望可以不用去源页面注册插件,取而代之动态地注册一个插件从而实现业务逻辑。下面我们以一个具体的业务场景来进行说明。

在单据上A上有一个字段“币别”,业务希望在打开币别的F7列表选择界面时,不展示“使用状态”&“描述”两列。

一种方案是:扩展币别(bd_currency)页面,然后在其列表设计器界面注册列表插件去实现该需求,但这样就会带来一个问题:所有在选择币别的时候,其弹出的F7列表选择界面都不会含有“使用状态”、“描述”两列。所以,为了避免这个问题,我们可以采用另一个方案:在单据A上币别字段的 beforeF7Select 事件中动态添加一个列表插件,从而达到我们的目标。


二、思路与方案

在苍穹平台中,每一个页面都对应一个类(*ShowParameter),而它们都继承自 kd.bos.form.FormShowParameter。该类提供一个方法 addCustPlugin(String) ,故我们可考虑针对单据上的币别字段添加 beforeF7Select 监听(addBeforeF7SelectListener)之后,给币别的F7列表界面动态注册插件。


三、实现过程

1. 新建业务单据,为简化需求,该页面上只放置一个币别控件,其设计器界面如下图所示。

image.png


2. 编写列表插件,实现币别F7列表界面隐藏"使用状态" & "描述"列。

注意:

该插件无需注册。

package kd.test.bill;

import java.util.EventObject;

import kd.bos.list.plugin.AbstractListPlugin;

public class DemoListPlugin extends AbstractListPlugin {
	
	@Override
	public void afterCreateNewData(EventObject e) {
		// 币别列表界面隐藏"使用状态" & "描述"列
		getView().setVisible(false, "description", "enable");
		super.afterCreateNewData(e);
	}
	
}


3. 对币别字段注册监听,然后在其 beforeF7Select 事件中给币别F7列表界面动态注册第 2 步中开发的列表插件。

注意:

该插件注册在第 1 步开发的页面上。

package kd.test.bill;

import java.util.EventObject;

import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.control.Control;
import kd.bos.form.field.BasedataEdit;
import kd.bos.form.field.events.BeforeF7SelectEvent;
import kd.bos.form.field.events.BeforeF7SelectListener;
import kd.bos.list.ListShowParameter;

public class DemoBillOrgPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener {
	
	@Override
	public void registerListener(EventObject e) {
		super.registerListener(e);
		// 对币别字段添加f7选择监听
		BasedataEdit basedataEdit = getControl("kdec_currency");
		basedataEdit.addBeforeF7SelectListener(this);
	}
	
	@Override
	public void beforeF7Select(BeforeF7SelectEvent evt) {
		Control control = (Control) evt.getSource();
		if (StringUtils.equalsIgnoreCase("kdec_currency", control.getKey())) {
			// 对币别F7列表界面动态添加列表插件
			ListShowParameter parameter = (ListShowParameter) evt.getFormShowParameter();
			parameter.addCustPlugin("kd.test.bill.DemoListPlugin");
		}
	}
	
}


四、实现效果

原币别列表界面:

image.png


业务单据上币别字段选择数据时F7界面的效果图:

image.png


五、开发环境版本

不限


六、注意事项

① 重点是要获取到页面对象(*ShowParameter),然后调用 addCustPlugin 方法即可。

② 业务开发请注意记录日志!


七、参考资料

开发平台

学习成长中心

控件使用指南——基础资料字段

FormShowParameter的属性初探



赞 9