AJAX
Для добавления AJAX функционала в MV рекомендуется придерживаться следующих правил:
- Если проект развернут в поддиректории, добавить в JavaScript путь от корня до проекта.
- Создать маршрут с читабельным и понятным URL.
- В шаблоне, на который придет URL, использовать методы класса Http.
Передаем в JavaScript полный путь до проекта в файл views/main-header.php добавляем строку с путем.
<script type="text/javascript"> const rootPath = '<? echo $mv -> root_path; ?>'; </script>
Добавляем маршрут и создаем нужный файл шаблона, на который пойдет AJAX запрос.
//Файл config/routes.php
'/ajax/form/feedback' => 'ajax/feedback-form.php'
В JavaScript файле добавляем код отправки AJAX запроса, для примера на JQuery.
$.ajax(
{
type: 'POST',
dataType: 'json',
url: rootPath + 'ajax/form/feedback',
data: $('#feedback-form').serialize(),
success: function(data)
{
//Обработка ответа (для формы)
if(data.valid)
{
...
}
else
{
//Ошибки формы в виде массива
data.errors.fields
//Единый html с ошибками формы
data.errors.all
}
}
});
В файле шаблона проверяем запрос и подготавливаем ответ в виде JSON либо HTML, если генерируем фрагмент HTML кода для вставки на страницу.
//Файл views/ajax/feedback-form.php
//Сначала проверяем что пришел POST AJAX запрос, если нет, то exit
Http::isAjaxRequest('post', true);
//Проверяем наличие параметров в запросе, генерируем HTML
if(isset($_POST['param']))
{
$html = $mv -> model -> method();
...
}
//Или например обрабатываем форму
$form -> submit() -> validate();
//В самом конце возвращаем ответ в формате JSON
$json = ['success' => true];
Http::responseJson($json);
//Другие форматы ответа
Http::responseXml($xml);
Http::responseHtml($html);
Http::responseText($text);
Если в AJAX запросе обрабатывается форма, то рекомендуется в качестве ответа возвращать JSON объект с результатом метода формы getState().
//Файл views/ajax/feedback-form.php
Http::isAjaxRequest('post', true);
$form = new Form('Feedback');
$form -> useAjaxTokenCSRF() -> useJqueryToken();
$form -> submit() -> validate();
if($form -> isValid())
{
...
}
Http::responseJson($form -> getState());
Если в ответе к состоянию формы нужно добавить дополнительные данные, то используется метод addStateValue().
//Файл views/ajax/feedback-form.php
if($form -> isValid())
{
...
$form -> addStateValue('link', 'https://...');
}
Http::responseJson($form -> getState());
Предыдущий раздел
Фильтрация