108 AJAX
- Введение
- Как AJAX обрабатывает запрос
- Обработчики Ajax
- API атрибутов данных
- Примеры API атрибутов данных
- JavaScript API
- Примеры API JavaScript
- Вызов обработчиков AJAX, определенных в компонентах
- Глобальные события AJAX
- Возврат данных из обработчиков AJAX
- Перенаправления в обработчиках AJAX
October включает инфраструктуру AJAX, которая позволяет вам выполнять обработчики AJAX, определенные в ваших страницах, макетах or компонентах и обновлять блоки страниц с помощью чанков. AJAX фреймворк поставляется в двух вариантах - в виде API JavaScript и API атрибутов данных. API атрибутов данных не требует знания JavaScript для использования AJAX с October.
Введение
Чтобы использовать фреймворк AJAX, он должен быть включен, помещением тега {% framework %}
где-нибудь внутри страницы или макета. Это добавляет ссылку на библиотеку JavaScript для интерфейсов October. Библиотека требует jQuery, поэтому она должна быть загружена первой, например:
<script src="/{{ [
'assets/javascript/jquery.js',
]|theme }}"></script>
{% framework %}
Тег {% framework %}
поддерживает необязательный параметр extras. Если этот параметр указан, тег добавляет файлы CSS и JavaScript, которые содержат плагин индикатора загрузки и классы CSS для стилизации индикатора загрузки. При запуске запроса AJAX индикатор отображается в верхней части страницы.
{% framework extras %}
Как AJAX обрабатывает запрос
Страница может выдавать запрос AJAX с атрибутами данных или с помощью JavaScript. Каждый запрос вызывает обработчик событий на сервере и может обновлять элементы страницы с помощью чанков. Запросы AJAX работают лучше всего с формами, поскольку данные формы автоматически отправляются на сервер. Последовательность запросов AJAX:
- Клиент выдает запрос AJAX, предоставляя имя обработчика AJAX и необязательно другие параметры.
- Сервер находит обработчик AJAX и выполняет его.
- Обработчик выполняет требуемую бизнес-логику и обновляет среду Twig, вставляя переменные страницы.
- Сервер отображает частичные данные, запрошенные клиентом с помощью опции
update
. - Сервер отправляет ответ, содержащий разметку с отрендеренными чанками.
- Фреймворк клиентской стороны обновляет элементы страницы с блоками данных, полученными с сервера.
Ниже приведен простой пример использования API атрибутов данных для формы калькулятора AJAX. Форма ссылается на пример обработчика onTest, продемонстрированный в разделе Обработчики Ajax ниже. Пример можно легко преобразовать для использования [JavaScript API] (#javascript-api).
<form data-request="onTest" data-request-update="calcresult: '#result'">
<input type="text" name="value1"/>
<input type="text" name="value2"/>
<input type="submit" value="Calculate">
</form>
<div id="#result"></div>
Конфигурация формы из предыдущего примера может быть прочитана следующим образом: «Когда форма отправлена, отправить запрос AJAX обработчику onTest . Когда обработчик закончит, отрендерить calcresult и добавить его содержимое в элемент #result.". Ниже приведен пример чанка calracesult. Он в основном выводит переменную result
, подготовленную обработчиком AJAX.
The result is {{ result }}
Обработчики Ajax
Обработчики AJAX - это функции PHP, которые могут быть определены на странице или в блоках PHP кода макета или внутри компонентов. Имена обработчиков должны соответствовать следующему шаблону: onName
. Обработчики могут вводить переменные среды Twig, где они могут использоваться во время рендеринга чанка. В следующем примере показан Ajax обработчик, определенный в разделе PHP страницы. Обработчик загружает два значения POST и вводит переменную страницы result.
url = "js"
layout = "default"
==
function onTest()
{
$value1 = post('value1');
$value2 = post('value2');
$this['result'] = $value1 + $value2;
}
==
Обратите внимание: Если два обработчика с одинаковым именем, определенным вместе на странице и макете, будут выполняться обработчик страниц. У обработчиков, определенных в компонентах, самый низкий приоритет.
API атрибутов данных
API атрибутов данных позволяет отправлять запросы AJAX без JavaScript. Во многих случаях API атрибутов данных менее подробный, чем JavaScript API - вы пишете меньше кода, чтобы получить тот же результат. Поддерживаемые атрибуты данных AJAX:
- data-request - указывает имя обработчика AJAX.
- data-request-confirm - указывает подтверждающее сообщение. Подтверждение отображается до отправки запроса. Если пользователь нажимает кнопку «Отмена», запрос не отправляется.
- data-request-redirect - указывает URL-адрес для перенаправления браузера после успешного запроса AJAX.
- data-request-update - задает список фрагментов и элементов страницы (селекторов CSS) для обновления. Формат следующий:
чанк: селектор, чанк: селектор
. В некоторых случаях требуется использование кавычек, например:'my-partial': '# myelement'
. Если перед селекторной строкой стоит символ@
, содержимое, полученное с сервера, будет добавлено к элементу вместо замены существующего содержимого. - data-request-data - указывает дополнительные параметры POST, отправляемые на сервер. Формат следующий:
var: value, var: value
. При необходимости используйте амперсанды:var: 'some string'
. Атрибут может использоваться в элементе триггера, например, на кнопке, которая также имеет атрибут data-request, в ближайшем элементе триггерного элемента и в элементе родительской формы. Структура объединяет значения атрибутов data-request-data. Если атрибут в разных элементах определяет параметры с одним и тем же именем, структура использует следующий приоритет: триггерный элементdata-request-data
, более близкие родительские элементыdata-request-data
, входные данные формы. - data-request-before-update - указывает код JavaScript для выполнения непосредственно перед обновлением содержимого страницы. Внутри кода JavaScript вы можете получить доступ к следующим переменным:
$el
(элемент страницы вызвавший запрос), объектcontext
, объектdata
, полученные с сервера, текстовую строкуtextStatus
и строкуJqXHR
. - data-request-success - указывает код JavaScript, который будет выполняться после успешного завершения запроса. Внутри кода JavaScript вы можете получить доступ к следующим переменным:
$el
(элемент страницы вызвавший запрос), объектcontext
, объектdata
, полученные с сервера, текстовую строкуtextStatus
и строкуJqXHR
. - data-request-error - указывает код JavaScript для выполнения, если запрос встречает ошибку. Внутри кода JavaScript вы можете получить доступ к следующим переменным:
$el
(элемент страницы вызвавший запрос), объектcontext
, объектdata
, полученные с сервера, текстовую строкуtextStatus
и строкуJqXHR
. - data-request-loading - определяет селектор CSS для элемента, отображаемого во время выполнения запроса. Вы можете использовать эту опцию для отображения индикатора загрузки AJAX. Функция использует функции jQuery
show ()
иhide ()
для управления видимостью элемента. - data-track-input - может быть применено к полю ввода текста или пароля, которое также имеет атрибут data-request. Когда определено, поле ввода автоматически отправляет запрос AJAX, когда пользователь что-либо вводит в поле. Необязательное значение атрибута может определять интервал, в миллисекундах, время ожидания фреимворка перед отправкой запросов.
Когда для элемента задан атрибут data-request
, элемент инициирует запрос AJAX, когда пользователь взаимодействует с ним. В зависимости от типа элемента запрос запускается в следующих случаях:
- Формы - при отправке формы.
- Ссылки, кнопки - при щелчке по элементу.
- Поля для ввода текста и пароля - когда текст изменяется и только если представлен атрибут
data-track-input
. - Раскрывающиеся списки, флажки, радиокнопки - когда элемент выбран.
Примеры API атрибутов данных
Запустить обработчик onCalculate
, когда форма отправлена. Обновит элемент с идентификатором "result" с чанком calcresult:
<form data-request="onCalculate" data-request-update="calcresult: '#result'">
Запросить подтверждение при нажатии кнопки «Удалить» до отправки запроса:
<form ... >
...
<button data-request="onDelete" data-request-confirm="Are you sure?">Delete</button>
Перенаправить на другую страницу после успешного запроса:
<form data-request="onLogin" data-request-redirect="/admin">
Показывать всплывающее окно после успешного запроса:
<form data-request="onLogin" data-request-success="alert('Yay!')">
Отправит параметр POST mode
со значениемupdate
:
<form data-request="onUpdate" data-request-data="mode: 'update'">
Отправит параметр POST id
со значением7
для нескольких элементов:
<div data-request-data="id: 7">
<button data-request="onDelete">Delete</button>
<button data-request="onSave">Update</button>
</div>
JavaScript API
JavaScript API является более мощным, чем API атрибутов данных. Метод request ()
можно использовать с любым элементом, находящимся внутри формы, или с элементом формы. Когда метод используется с элементом внутри формы, он пересылается в форму.
Метод request ()
имеет единственный обязательный параметр - имя обработчика AJAX. Пример:
<form onsubmit="$(this).request('onProcess'); return false;">
...
Второй атрибут метода request()
- это объект options. Вы можете использовать любые опции и методы, совместимые с функцией jQuery AJAX. Для фреймворка October определены следующие параметры:
- update - объект, задает список чанков и элементов страницы (как селекторы CSS) для обновления: {'чанк': '#select'}. Если перед селекторной строкой стоит символ
@
, содержимое, полученное с сервера, будет добавлено к элементу вместо замены существующего содержимого. - confirm - строка подтверждения. Если установлено, подтверждение отображается до отправки запроса. Если пользователи нажимают кнопку «Отмена», запрос отменяется.
- data - необязательный объект, указывающий данные, отправляемые на сервер вместе с данными формы: {var: 'value'}.
- redirect строка, указывающая URL-адрес для перенаправления браузера на после успешного запроса.
- beforeUpdate - функция обратного вызова, выполняемая перед обновлением элементов страницы. Функция получает 3 параметра: объект данных, полученный с сервера, текстовая строка состояния и объект jqXHR. Переменная
this
внутри функции разрешает содержимое запроса - объект, содержащий 2 свойства: "handler" и "options", представляющие исходные параметры request(). - success - функция обратного вызова для выполнения в случае успешного запроса. Если эта опция включена, она отменяет функциональность фреймворка по умолчанию: элементы не обновляются, событие
beforeUpdate
не запускается, событияajaxUpdate
иajaxUpdateComplete
не срабатывают. Обработчик события получает 3 аргумента: объект данных, полученный с сервера, текстовая строка состояния и объект jqXHR. Тем не менее, вы по-прежнему можете вызвать функцию фреймворка по умолчанию, вызываяthis.success(...)
внутри вашей функции. - error - функция обратного вызова выполняется в случае ошибки. По умолчанию выводится предупреждение. Если эта опция переопределена, предупреждение не будет отображаться. Обработчик получает 3 параметра: объект jqXHR, текстовую строку состояния и объект ошибки - см. Функция AJAX jQuery.
- complete - функция обратного вызова выполняется в случае успеха или ошибки.
Примеры API JavaScript
Запросит подтверждение перед отправкой запроса на удаление:
$('form').request('onDelete', {
confirm: 'Are you sure?',
redirect: '/dashboard'
})
Выполнить обработчик onCalculate
и вставить обработанный чанком calracesult результат в элемент страницы с CSS классом result:
$('form').request('onCalculate', {
update: {calcresult: '.result'}
})
Запустит обработчик onCalculate
с некоторыми дополнительными данными:
$('form').request('onCalculate', {data: {value: 55}})
Запустит обработчик onCalculate
и запустит некоторый корректирующий код перед обновлением элементов страницы:
$('form').request('onCalculate', {
update: {calcresult: '.result'},
beforeUpdate: function(){ /* do something */ }
})
Запустит обработчик onCalculate
и, если он будет успешным, запустит некоторый корректирующий код и функцию success
по умолчанию:
$('form').request('onCalculate', {success: function(data){
//... do something ...
this.success(data);
}})
Выполнит запрос без элемента FORM:
$.request('onCalculate', {
success: function(){
console.log('Finished!')
}
})
Запустит обработчик onCalculate
и, если успешно, запустит некоторый корректирующий код после выполнения функции success
по умолчанию:
$('form').request('onCalculate', {success: function(data){
this.success(data).done(function() {
//... do something after parent success() is finished ...
});
}})
Вызов обработчиков AJAX, определенных в компонентах
Если вам нужно отправить запрос обработчику AJAX, определенному в компоненте, прикрепленном к странице или макету, вы должны указать префикс имени обработчика с кратким именем компонента или его [алиасом] (./cms-components.md#aliases). Следующий пример демонстрирует, как вызвать AJAX обработчик onCalculate, определенный в воображаемом компоненте calculator:
<form data-request="calculator::onCalculate" data-request-update="calcresult: '#result'">
Глобальные события AJAX
Структура AJAX запускает несколько событий над обновленными элементами, формой и объектом окна. События запускаются независимо от того, какой API был использован - API атрибутов данных или API JavaScript.
- ajaxUpdate - запускается для элемента страницы после того, как он обновлен фреймворком. Обработчик получает 5 параметров: объект события, контекстный объект, объект данных, полученный от сервера, текстовую строку состояния и объект jqXHR.
- ajaxUpdateComplete - запускается для объекта window после того, как все элементы обновляются фреймворком. Обработчик получает 5 параметров: объект события, контекстный объект, объект данных, полученный от сервера, текстовую строку состояния и объект jqXHR.
- ajaxBeforeUpdate - запускается в объекте формы сразу после завершения запроса, но до обновления страницы. Обработчик получает 5 параметров: объект события, контекстный объект, объект данных, полученный от сервера, текстовую строку состояния и объект jqXHR.
- ajaxSuccess - запускается в объекте формы после того, как запрос будет успешно завершен. Обработчик получает 5 параметров: объект события, контекстный объект, объект данных, полученный от сервера, текстовую строку состояния и объект jqXHR.
- ajaxError - запускается в объекте формы, если запрос встречает ошибку. Обработчик получает 5 параметров: объект события, контекстный объект, текстовую строку состояния и объект jqXHR.
В следующем примере выполняется код JavaScript, когда событие ajaxUpdate
запускается для элемента.
$('.calcresult').on('ajaxUpdate', function(){
console.log('Updated!');
})
Возврат данных из обработчиков AJAX
В продвинутых случаях вы можете захотеть вернуть структурированные данные из ваших обработчиков AJAX. Если AJAX-обработчик возвращает массив, вы можете получить доступ к его элементам в обработчике событий success
. Пример обработчика AJAX:
function onFetchDataFromServer()
{
/* Какай нибудь код на стороне сервера */
return [
'totalUsers'=>1000,
'totalProjects'=>937
];
}
Данные могут быть получены с помощью атрибутов данных API:
<form data-request="onHandleForm" data-request-success="console.log(data)">
То же самое с JavaScript API:
<form
onsubmit="$(this).request('onHandleForm', {
success: function(data){
console.log(data)
}
}); return false;">
Перенаправления в обработчиках AJAX
Если вам нужно перенаправить браузер в другое место, верните объект Redirect
из обработчика AJAX. Фреймворк будет перенаправлять браузер, как только ответ будет возвращен с сервера. Пример обработчика AJAX:
function onRedirectMe()
{
return Redirect::to('http://google.com');
}