CPA-Мастер
Блог о заработке на партнёрских программах в CPA-сетях

Отправляем AJAX-запросы с помощью apex.server.process

AJAX-запросы (асинхронный JavaScript и XML) используются в веб-разработке для подгрузки данных с сервера без обновления всей страницы. В Apex нет надобности мучаться с XMLHttpRequest, так как JavaScript API этой среды разработки предоставляет функционал для осуществления таких запросов. Также есть возможность использования jQuery для этих задачь, в действительности функция apex.server.process, о которой пойдёт речь, является враппером этого функционала AJAX-запросов библиотеки, но об этом как-нибудь в другой раз.

AJAX-запрос обращается к серверным процессам и сперва мы поговорим о них. Серверный процесс можно объявить на уровне приложения (Shared Components -> Application Logic -> Application Process), если он будет использоваться в нескольких страницах, или на уровне страницы (Processes -> Execution Options -> Point -> AJAX Callback), и выполняться они будут по запросу (on demand). В качестве источника нужно указать код PL/SQL. В моём примере я просто возвращаю значение переменной APEX_APPLICATION.G_X01 из запроса, если такая имеется, а иначе строку ‘null’.

BEGIN
    IF APEX_APPLICATION.G_X01 IS NOT NULL THEN
        HTP.PRN(APEX_APPLICATION.G_X01);
    ELSE
        HTP.PRN('null');
    END IF;
END;

Для выполнения функциии apex.server.process нужно указать идентификатор (название процесса), переменную/переменные и действие, которое должно произойти в случае успешного завершения запроса. В моём примере я обращаюсь к процессу с названием «process_name», передаю переменную x01 со значением «var 1» и функцию, которая выводит всплывающее окно с ответом от сервера. Как я определил в процессе выше, возвращаться будет значение переменной, то есть «var 1». В опции dataType указываем тип данных, которые ожидаем в ответе от сервера (по умолчанию это JSON).

apex.server.process("process_name", 
    {
        x01: "var 1"
    }, { 
        dataType: 'text',
        success: function(response) {
            alert(response);
        }
    }
);

Пока запрос выполняется, было бы неплохо, чтобы пользователь понимал, что происходит. В опции apex.server.process можно добавить loadingIndicatorPosition, который будет показывать прогресс в виде «колеса загрузки».

apex.server.process("test", 
    {
        x01: "var 1"
    }, { 
        dataType: 'text',
        success: function(response) {
            alert(response);
        },
        loadingIndicatorPosition: "page"
    }
);

По умолчанию запрос apex.server.process асинхронный, но его можно сделать синхронным, просто добавив опцию async: false.

apex.server.process("process_name", 
    {
        x01: "var 1"
    }, { 
        dataType: 'text',
        async: false,
        success: function(response) {
            alert(response);
        }
    }
);

На страницах Apex используются так называемые Page Items, это просто элементы (здесь не имеется ввиду HTML) страницы, которые могут содержать разную информацию. Их также можно передавать через AJAX-запросы и напрямую обращаться к ним в серверном процессе. Для следующих примеров нужно изменить процесс, как описано ниже, и тогда он будет возвращать не переменную, а значение Page Item.

BEGIN
    IF :PAGE_ITEM IS NOT NULL THEN
        HTP.PRN(:PAGE_ITEM);
    ELSE
        HTP.PRN('null');
    END IF;
END;

Передавать Page Items можно по идентификатору, а разделяя их запятой можно передать сразу несколько таких элементов.

apex.server.process("process_name", 
    {
        pageItems: "#PAGE_ITEM"
    }, { 
        dataType: 'text',
        success: function(response) {
            alert(response);
        }
    }
);

Во втором варианте передаются два массива, в первом из которых перечисленны названия элементов, а во втором их значения.

apex.server.process("process_name", 
    {
        p_arg_names: ["PAGE_ITEM"],   
        p_arg_values: ["var 1"]  
    }, { 
        dataType: 'text',
        success: function(response) {
            alert(response);
        },
    }
);
Понравился пост? Поделись в соцсетях и подписывайся на аккаунты в Twitter и Facebook!

Leave a comment

Your email address will not be published.

*