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