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;
}
}
我试图掌握以下 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;
}
}