如何在APInvoiceEntry与JournalEntry扩展类添加自定义操作至操作菜单
APInvoiceEntry与JournalEntry自定义操作添加到Action菜单的实现方案
不需要在扩展类中自行实现IActionsMenuGraph接口,框架提供了两种通用合规的实现方式,适配所有PXGraph派生类,不存在版本兼容或逻辑覆盖风险。
方案1:声明式特性挂载(官方推荐,适用于Acumatica 2021 R1及以上版本)
直接在自定义Action上标注PXAddMenuAttribute,框架初始化时会自动将Action注入对应菜单,完全不依赖基类的接口实现,代码最简洁,也符合官方开发规范。
- APInvoiceEntry扩展示例:
public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry> { public PXAction<APInvoice> ChangeSomeField; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Change Some Field", MapEnableRights = PXCacheRights.Update)] // 核心配置:指定挂载到当前图的Action菜单 [PXAddMenu(typeof(APInvoiceEntry), nameof(Actions), MenuType = MenuType.Action)] protected virtual IEnumerable changeSomeField(PXAdapter adapter) { // 此处编写字段修改的业务逻辑 if (Base.Document.Current != null) { APInvoice doc = Base.Document.Current; // 自定义字段赋值、持久化逻辑 Base.Document.Update(doc); Base.Persist(); } return adapter.Get(); } }
- JournalEntry扩展示例:
public class JournalEntryExt : PXGraphExtension<JournalEntry> { public PXAction<Batch> ChangeSomeField; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Change Some Field", MapEnableRights = PXCacheRights.Update)] [PXAddMenu(typeof(JournalEntry), nameof(Actions), MenuType = MenuType.Action)] protected virtual IEnumerable changeSomeField(PXAdapter adapter) { // 此处编写字段修改的业务逻辑 return adapter.Get(); } }
方案2:初始化方法手动注册(适用于所有Acumatica版本)
如果使用的是2021 R1之前的旧版本,可以在图扩展的Initialize方法中,直接调用Base.Actions集合自带的AddMenuAction方法完成注册。
误区澄清:认为只有实现了
IActionsMenuGraph的类才能调用AddMenuAction是认知偏差——AddMenuAction本质是定义在PXActionsCollection类型上的扩展方法,所有PXGraph的Actions集合都支持直接调用,和图本身是否实现IActionsMenuGraph无关。ARInvoiceEntry基类封装的ActionsMenuItem.AddMenuAction()只是上层的快捷封装,底层调用的是同一个集合方法。
对应JournalEntry的实现示例:
public class JournalEntryExt : PXGraphExtension<JournalEntry> { public PXAction<Batch> ChangeSomeField; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Change Some Field")] protected virtual IEnumerable changeSomeField(PXAdapter adapter) { // 业务逻辑 return adapter.Get(); } public override void Initialize() { base.Initialize(); // 直接调用Actions集合的扩展方法添加菜单 Base.Actions.AddMenuAction(ChangeSomeField); // 如需调整菜单位置,可调用AddMenuAction的重载参数指定排序、父菜单节点 } }
禁止实现方案
不要在图扩展中自行实现IActionsMenuGraph接口:该接口的框架内部实现依赖专属的菜单初始化管线,在扩展类中重写实现会覆盖原生菜单加载逻辑,导致系统原有操作菜单项丢失、角色权限配置失效、菜单顺序错乱等兼容性问题。
内容的提问来源于stack exchange,提问作者Ruald Venter
相关产品推荐
相关产品推荐

