这是5天前发布的“ APEX行选择器”的后续内容。
问题是从交互式网格中收集多个值。从出色的链接到提供的帖子,我都能实现这一目标。但是,项目的下一部分是打开编辑对话框页面并更新多个值。
我将此代码添加到了交互式网格的属性中:
function (config)
{
var $ = apex.jQuery,
toolbarData = $.apex.interactiveGrid.copyDefaultToolbar(),
toolbarGroup = toolbarData.toolbarFind("actions3");
toolbarGroup.controls.push(
{
type: "BUTTON",
action: "updateCar",
label: "Edit Selected Cars",
hot: true,
});
config.toolbarData = toolbarData;
config.initActions = function (actions)
{
// Defining the action for activate button
actions.add(
{
name: "updateCar",
label: "Edit Selected Cars",
action: updateCar
});
}
function updateCar(event, focusElement)
{
var i, records, model, record,
view = apex.region("ig_car").widget().interactiveGrid("getCurrentView");
var vid = "";
model = view.model;
records = view.getSelectedRecords();
if (records.length > 0)
{
for (i = 0; i < records.length; i++)
{
record = records[i];
alert("Under Development " + record[1]);
vid = vid + record[1] + "||";
apex.item("P18_CAR").setValue(vid);
// need to open next page here and pass parameters
}
}
}
return config;
}
我需要知道如何打开表单并使参数值可用于传递给oracle更新脚本。
感谢您提供的任何帮助。我确实找到了一些帖子,但我确实需要一个很好的例子。我尝试了一切都无济于事。
您可以通过多种方式执行此操作。这是一种方法,也许其他人会提供更有效的选择。
此处记录了APEX中用于导航的JavaScript选项:https://docs.oracle.com/en/database/oracle/application-express/19.1/aexjs/apex.navigation.html
由于您试图打开一个单独的页面,您可能要使用apex.navigation.dialog
,这是APEX从报表,按钮等打开模式页面时自动使用的内容
但是,如文档中所述,出于安全目的,导航URL必须在服务器端生成。您需要一个动态URL(页面呈现时未知),因此需要一种变通方法来生成它。有了URL,就可以轻松导航到它。那么您如何获得URL? Ajax。
创建一个Ajax进程以生成URL
代码:
declare
l_url varchar2(512);
begin
l_url := apex_page.get_url(
p_application => :APP_ID,
p_page => 3,
p_items => 'P3_ITEM_NAME',
p_values => apex_application.g_x01
);
apex_json.open_object();
apex_json.write('url', l_url);
apex_json.close_object();
end;
[请注意,我正在使用apex_item.get_url
获取URL,这是apex_util.prepare_url
的替代方法。我还使用apex_json
发出JSON来响应客户端。
此外,对apex_application.g_x01
的引用也很重要,因为它将包含从调用页面中选择的值。您将在下一步中看到如何设置。
使用JavaScript打开URL
在调用页面的“函数和全局变量声明”属性中输入以下代码:
function openFormPage(ids) {
apex.server.process(
'GET_FORM_URL',
{
x01: ids.join(':')
},
{
success: function (data) {
var funcBody = data.url.replace(/^"javascript:/, '').replace(/\"$/,'');
new Function(funcBody).call(window);
},
error: function (jqXHR, textStatus, errorThrown) {
console.error(errorThrown);
// handle error
}
}
);
}
在这种情况下,我正在使用apex.server.process调用服务器端PL / SQL进程。请注意,我正在将ids.join(':')
的值传递给x01
。该值将在PL / SQL代码中变为apex_application.g_x01
。您可以使用其他项目,也可以将冒号分隔的值字符串仅传递给一个项目(如我正在执行的操作)。
返回给客户端的URL将不是标准URL,而是包含该URL的JavaScript代码段。您需要删除开头和结尾部分,并使用剩下的内容在JavaScript中生成动态函数。
这通常是令人不悦的,但是我相信在这种情况下它是足够安全的,因为我知道我可以相信流程调用的响应不是恶意的JavaScript代码。
添加安全检查!!
由于您正在创建一种动态方式来生成用于打开第3页(或您要定位的任何页面)的URL,因此需要确保对模式页面进行保护。在该页面上,创建一个Header之前的过程,以验证P3_ITEM_NAME的值。如果用户不应该访问这些值,则抛出异常。