本文描述了如何在业务开发过程中,避免扩展页面影响其他继承页面,通过动态注册插件的方式实现特定业务需求。文中以单据上币别字段为例,详细说明了如何在币别字段的F7选择事件前动态添加一个列表插件,以隐藏“使用状态”和“描述”两列,从而满足业务需求。此外,还介绍了实现过程的步骤、代码示例、实现效果及开发环境和注意事项。
关键词:列表
一、需求
在业务开发过程中,有时候需要对标准产品做一定程度的二开,但又不想扩展页面后注册插件,因为这样可能会影响很多继承/扩展自该页面的其他页面,因此我们希望可以不用去源页面注册插件,取而代之动态地注册一个插件从而实现业务逻辑。下面我们以一个具体的业务场景来进行说明。
在单据上A上有一个字段“币别”,业务希望在打开币别的F7列表选择界面时,不展示“使用状态”&“描述”两列。
一种方案是:扩展币别(bd_currency)页面,然后在其列表设计器界面注册列表插件去实现该需求,但这样就会带来一个问题:所有在选择币别的时候,其弹出的F7列表选择界面都不会含有“使用状态”、“描述”两列。所以,为了避免这个问题,我们可以采用另一个方案:在单据A上币别字段的 beforeF7Select 事件中动态添加一个列表插件,从而达到我们的目标。
二、思路与方案
在苍穹平台中,每一个页面都对应一个类(*ShowParameter),而它们都继承自 kd.bos.form.FormShowParameter。该类提供一个方法 addCustPlugin(String) ,故我们可考虑针对单据上的币别字段添加 beforeF7Select 监听(addBeforeF7SelectListener)之后,给币别的F7列表界面动态注册插件。
三、实现过程
1. 新建业务单据,为简化需求,该页面上只放置一个币别控件,其设计器界面如下图所示。
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"); } } }
四、实现效果
原币别列表界面:
业务单据上币别字段选择数据时F7界面的效果图:
五、开发环境版本
不限
六、注意事项
① 重点是要获取到页面对象(*ShowParameter),然后调用 addCustPlugin 方法即可。
② 业务开发请注意记录日志!
七、参考资料
推荐阅读