Есть разные способы сделать это. Вот один из способов, возможно, кто-то другой предложит более эффективный вариант.
Опции 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-адреса
- На вкладке обработки страницы отчета / сетки щелкните правой кнопкой мыши Ajax Callback и выберите Процесс создания .
- Установить для имени GET_FORM_URL .
- Установить 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. Если пользователь не должен иметь возможность доступа к этим значениям, выведите исключение.