【问题标题】:APEX row selector part 2APEX 行选择器第 2 部分
【发布时间】:2020-02-17 23:23:13
【问题描述】:

这是 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


    【解决方案1】:

    有多种方法可以做到这一点。这是一种方法,也许其他人会提供更有效的选择。

    此处记录了 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 进程来生成 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 打开网址

    在调用页面的函数和全局变量声明属性中输入以下代码:

    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 sn-p。您需要删除前导部分和尾随部分,并使用剩下的部分在 JavaScript 中生成动态函数。

    这通常是不受欢迎的,但我相信在这种情况下它足够安全,因为我知道我可以相信来自进程调用的响应不是恶意 JavaScript 代码。

    添加安全检查!!!

    因为您正在创建一种动态方式来生成 URL 以打开第 3 页(或您要定位的任何页面),所以您需要确保模态页面受到保护。在该页面上,创建验证 P3_ITEM_NAME 值的 Before Header 流程​​。如果用户不应该能够访问这些值,则抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多