-
Notifications
You must be signed in to change notification settings - Fork 9
query
Запуск AJAX-запроса на JSON-данные, базовая обработка ответа.
Допустим, $_REQUEST имеет значение:
$_REQUEST = {
type: "stat_form_0609204",
_secret: ['passwd']
}
Тогда вызов
query ({action: 'update'}, {data: {
name: "v_03_01",
value: 123,
passwd: "p4$$w0rd"
}}, function (data) {
// здесь можно подправить data...
$_F5 (data)
})
инициирует POST-запрос на URL со строкой запроса
?type=stat_form_0609204&action=update
телом
{"data":{"name":"v_03_01",value:123}}
и дополнительным HTTP-заголовком
X-Request-Param-passwd: "p4$$w0rd"
Если полученный ответ будет иметь код 200 OK, тип application/json и содержимое
{"success":true, "content": {...}}
то будет вызвана функция $_F5 с аргументом, равным значению, взятому по ключу "content". В противном случае будет инициирована обработка ошибки (см. ниже).
1-м параметром передаётся объект для формирования целевого URL функцией dynamicURL.
Он может содержать ключи type, id, action и part. Для неупомянутых полей используются одноимённые компоненты $_REQUEST. Если этот параметр опущен, соответственно, URL формируется прямо из $_REQUEST.
Иногда требуется послать AJAX-запрос безо всяких параметров: для поддержания сессии в отсутствие действий пользователя. При этом следует явно указать {type:undefined}. Впрочем, для таких запросов предусмотрена специальная API-функция $_SESSION.keepAlive.
Это объект, содержимое которого будет передано в формате JSON в теле POST-запроса и, частично ($_REQUEST._secret), в HTTP-заголовках. То есть параметры запроса, отличные от базовых type, id, action и part.
Если эти данные требуется брать из полей ввода — можно воспользоваться функцией values. Если никаких дополнительных параметров не требуется — параметр может быть опущен.
Это функция, которая должна обработать компоненту content полученного JSON при условии, что компонента success имеет истинное значение. JSON иной структуры считается описанием ошибки.
Если этот параметр не задан, вызывается функция, присвоенная переменной $_F5. По умолчанию она вызовет use.block для текущего $_REQUEST.type, то есть вызовет повторную загрузку главного блока, отображаемого на экране в текущий момент.
Это функция, которая передаётся 2-м аргументом $_DO.apologize на случай, если для данного запроса требуется специфическая обработка нештатных ситуаций.
Характерный пример: организация периодического переспроса при превышении времени ожидания ответа. В этом случай 2-й аргумент (error) имеет значение timeout. Эта ситуация может случиться, если сервер успешно, но долго обрабатывает исходный запрос. Для таких действий имеет смысл предусмотреть периодическое обновление статуса объекта:
query ({action: 'import'}, {}, // запускаем импорт данных
$_F5, // если сразу получаем ответ, обновляем экран,
function (jqXHR, e) { // а если не вышло,
if (e !== 'timeout') throw e // причём случилась именно задержка ожидания,
var checker = setInterval (function () { // то будем периодически (раз в 5 с)
query ({}, {}, function (data) { // запрашивать текущий объект
if (data.pid) return // если процесс ещё идёт, время ещё не пришло
clearInterval (checker) // иначе останавливаем таймер
$_F5 () // и перерисовываем страницу
})
}, 5000)
})
Перед этим вызовом необходимо визуально обозначить процесс ожидания (затемнение, "крутилка" и т. п.). В данном примере предполагается, что сервер в начале процедуры пишет PID текущего процесса в одноимённое поле, а в конце — очищает его.