APEX行选择器部分2

问题描述 投票:0回答:1

这是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更新脚本。

感谢您提供的任何帮助。我确实找到了一些帖子,但我确实需要一个很好的例子。我尝试了一切都无济于事。

oracle-apex apex apex-code
1个回答
0
投票

您可以通过多种方式执行此操作。这是一种方法,也许其他人会提供更有效的选择。

此处记录了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

  1. 在报告/网格页面的处理选项卡下,右键单击Ajax回调,然后选择创建过程
  2. 将名称设置为GET_FORM_URL
  3. 将PL / SQL代码设置为以下内容

代码:

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的值。如果用户不应该访问这些值,则抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.