Idempiere/Adempiere 中 GridField 和 GridTab 之间的 Context 在哪里

Where do the Context fit between the GridField and the GridTab in Idempiere/Adempiere

我试图掌握以下 3 个概念 (类) 的目的,它们是 Idempiere/Adempiere.

中的核心功能

基于代码描述

我知道 GridTab 具有表示 ad_tab 的模型状态,它是任何 ad_tab 文件的 ViewModel 部分。简单的说我们会发现数据绑定到ad_table.

首先,对于 GridField 我认为是视图的模型,如果我可以滥用它就像 DOM 状态:我们有什么作为字段,字段的值和事件,我认为以模板视图为中心。

发现这两个(如果我的分析没有弄错的话)让我感到奇怪。 Ctx 究竟代表什么?它代表什么状态?

代码没有对此进行评论,有人可以回答我吗?

谢谢。

在 iDempiere 中,上下文是对整个应用程序全局的 Properties 对象。

您可以将上下文视为可以从系统的任何位置访问的一组全局变量。

可以点击 iDempiere 图标查看上下文变量,然后导航到 错误 选项卡,然后点击 查看 按钮,您会在行后找到变量:

=== Context ===

上下文中可以找到很多信息:

  • 登录变量:一些以#开头的,比如#AD_Role_ID
  • 默认:标记为默认的记录,同样以#开头,如#C_BP_Group_ID
  • 会计相关变量:以$开头的变量,如$C_Currency_ID
  • 全局首选项:以 P 开头,如 P|AutoCommit
  • Window 首选项:以 P 和数字开头,例如 P132|GL_Category_ID

然后,您感兴趣的上下文变量,windows 上每个字段的值是开放的:

  • Window 字段:以数字开头的字段,例如 1|DiscountSchema - 这意味着第一个 window 打开的字段 DiscountSchema
  • 选项卡字段:那些以两个数字开头的字段,例如 1|2|DatePromised - 这意味着第一个 window 打开的第三个选项卡(数字 2,选项卡从零开始编号)中的字段 DatePromised (数字 1)

您可以使用 Env.getContext... 方法访问这些上下文变量,也可以使用 Env.setContext...

方法添加和删除您自己的变量

ADempiere 中Context 的使用和意图与Carlos 描述的相同,只是访问权限不同。在网络中,您可以从 window 的右上角访问上下文,如下所示。

上下文如何提供全局状态的另一个例子是在测试中。这是来自测试设置 class 的片段,它使用时间和登录信息初始化上下文。然后可以通过测试 classes 访问上下文,使用数据库执行集成测试,就好像它们在实际使用中一样。此处的上下文仅限于登录信息,但可以扩展为包括测试所需的上下文的任何其他元素。

@BeforeAll
public static void setUpBeforeClass() {
    
    today = TimeUtil.getDay(System.currentTimeMillis());
    ctx = Env.getCtx();
    ctx.setProperty("#AD_Org_ID", Integer.toString(AD_ORG_ID));
    ctx.setProperty("#AD_User_ID", Integer.toString(AD_USER_ID));
    ctx.setProperty("#AD_Client_ID", Integer.toString(AD_CLIENT_ID));
    ctx.setProperty("#Date", TimeUtil.getDay(System.currentTimeMillis()).toString());
    ctx.setProperty("#AD_Language", "en");

    Ini.setClient (IS_CLIENT);
    Ini.loadProperties(false);
    org.compiere.Adempiere.startup(IS_CLIENT);

    trxName = Trx.createTrxName("TestRun_" + randomString(4));
    trx = Trx.get(trxName, false);
    
    try {
        mainSavepoint = trx.setSavepoint("AllTests_" + randomString(4));
    } catch (SQLException e) {
        fail(e.getMessage());
    }

}

@AfterAll
public static void tearDownAfterClass() {

    try {
        tryToRollback(mainSavepoint);
        trx.close();
    }
    catch(SQLException e) {
        fail("Unable to rollback. " + e.getMessage());
        
    }
    finally {
        trx.close();
        trx = null;
        ctx = null;
    }
    
}