Селектор строки APEX, часть 2 - PullRequest
1 голос
/ 21 октября 2019

Это продолжение «Селектора строк APEX», опубликованного 5 дней назад.

Проблема заключалась в сборе нескольких значений из интерактивной сетки. Благодаря превосходным ссылкам на посты я смог добиться этого. Однако следующая часть проекта - открыть диалоговую страницу редактирования и обновить несколько значений.

Я добавил этот код в атрибут интерактивной сетки:

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

Мне нужно знать, как открыть форму и чтобы значения параметров были доступны для передачи в скрипт обновления оракула.

Спасибо за любую помощь, которую вы можете оказать. Я нашел несколько постов, но мне действительно нужен хороший пример. Я перепробовал все безрезультатно.

1 Ответ

1 голос
/ 22 октября 2019

Есть разные способы сделать это. Вот один из способов, возможно, кто-то другой предложит более эффективный вариант.

Опции JavaScript для навигации в APEX описаны здесь: 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 Callback и выберите Процесс создания .
  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;

Обратите внимание, что для получения URL я использую apex_item.get_url, это альтернатива apex_util.prepare_url. Я также использую apex_json для передачи JSON для ответа клиенту.

Также важна ссылка на apex_application.g_x01, поскольку она будет содержать выбранные значения из вызывающей страницы. Вы увидите, как это было установлено на следующем шаге.

Откройте URL с помощью JavaScript

Введите следующий код в атрибуте Function и Global Variable Объявление атрибутавызывающая страница:

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-адресом. будет фрагмент JavaScript, который включает в себя URL. Вам нужно будет удалить начальную и конечную части и использовать то, что осталось, чтобы сгенерировать динамическую функцию в JavaScript.

Это, как правило, осуждается, но я считаю, что в этом контексте это достаточно безопасно, поскольку я знаю, что могу верить, что ответ от вызова процесса не является вредоносным кодом JavaScript.

Добавитьпроверка безопасности !!!

Поскольку вы создаете динамический способ создания URL-адресов для открытия страницы 3 (или любой другой страницы, на которую вы нацеливаетесь), вам необходимо убедиться, что модальная страница защищена,На этой странице создайте процесс Before Header, который проверяет значение P3_ITEM_NAME. Если пользователь не должен иметь возможность доступа к этим значениям, выведите исключение.

...