Oracle apex 顶点行选择器第2部分

Oracle apex 顶点行选择器第2部分,oracle-apex,Oracle Apex,这是5天前发布的“APEX行选择器”的后续内容 问题是从交互式网格中收集多个值。从优秀的链接后提供我能够做到这一点。但是,项目的下一部分是打开“编辑”对话框页面并更新多个值 我将以下代码添加到交互式网格的属性中: function (config) { var $ = apex.jQuery, toolbarData = $.apex.interactiveGrid.copyDefaultToolbar(), toolbarGroup = toolbarData.toolbarFi

这是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;
    }
函数(配置)
{
var$=apex.jQuery,
toolbarData=$.apex.interactiveGrid.copyDefaultToolbar(),
toolbarGroup=toolbarData.toolbarFind(“操作3”);
toolbarGroup.controls.push(
{
键入:“按钮”,
行动:“updateCar”,
标签:“编辑所选车辆”,
热:是的,
});
config.toolbarData=toolbarData;
config.initActions=函数(操作)
{
//定义激活按钮的操作
actions.add(
{
名称:“updateCar”,
标签:“编辑所选车辆”,
操作:updateCar
});
}
函数updateCar(事件、焦点元素)
{
var i,记录,模型,记录,
视图=apex.region(“ig_car”).widget().interactiveGrid(“getCurrentView”);
var vid=“”;
model=view.model;
records=view.getSelectedRecords();
如果(记录长度>0)
{
对于(i=0;i
我需要知道如何打开表单并将参数值传递给oracle更新脚本


谢谢你能提供的任何帮助。我确实找到了一些帖子,但我真的需要一个好的例子。我什么都试过了,都没有用

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

APEX中导航的JavaScript选项记录如下:

由于您试图打开一个单独的页面,您可能希望使用apex.navigation.dialog
,这是apex在从报表、按钮等打开模式页面时自动使用的

但是,如文档中所述,出于安全目的,必须在服务器端生成导航的URL。您需要一个动态URL(页面呈现时不知道该URL),因此需要一个变通方法来生成它。一旦你有了URL,导航到它就很容易了。那么,如何获取URL呢?阿贾克斯

创建一个Ajax进程来生成URL

  • 在report/grid页面的processing选项卡下,右键单击Ajax回调并选择创建流程
  • 将Name设置为获取表单URL
  • 将PL/SQL代码设置为以下值
  • 代码:

    请注意,我使用的是
    apex\u item.get\u url
    来获取url,这是
    apex\u util.prepare\u url
    的替代方法。我还使用
    apex\ujson
    为响应客户端发出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
          }
        }
      );
    
    }
    
    在本例中,我使用调用服务器端PL/SQL进程。请注意,我正在将
    ids.join(“:”)
    的值传递给
    x01
    。该值将在PL/SQL代码中作为
    apex\u application.g\u x01
    访问。您可以使用其他项,也可以将冒号分隔的值字符串传递给一个项(正如我所做的)

    返回给客户端的URL将不是标准URL,而是包含该URL的JavaScript片段。您需要删除前导部分和尾随部分,并使用剩下的部分在JavaScript中生成动态函数

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

    添加安全检查

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

    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
          }
        }
      );
    
    }