Идея очень проста, но дает значительные преимущества, по сравнению с кодом без применения данного шаблона, имеет потенциал активно применяться. Странно, но я не встречал ничего подобного в любом трендовом коде для повторного использования, поэтому назвал шаблон «CSN-Ajax» исходя из названия сайта и проекта «SKY Framewok», в котором шаблон впервые появился — CoreSky.Net, в моем проекте. Пример реализации я опишу здесь на основе применения PHP, jQuery и MVC паттерна. Итак, кратко, без комментариев:
1. Делаем в javascript функцию-обертку с именем ajax(action, postfields, func, controller) для $.post(..). Типичный вызов в коде приложения:
ajax('edit', post_vars, function(data) {
// ....
})
2. Кроме «оборачивания» кода jQuery $.post(..), функция делает еще кое-что. Параметр controller в коде приложения часто пропущен, как в примере выше, его функция берет из «document.location.href», в общем случае распарсивая его значение, но часто это просто первый ключ строки запроса (query string, GET запроса). Т.е. если controller не указан, то запрос надо отослать «на свой» котроллер, это частый случай.
3. Считаем что веб приложение имеет единую точку входа, как часто и есть. Функция ajax(..) конструирует GET часть запроса сформировав «controller» и еще добавляет первым ключем-значением "__AJAX__=_"
4. В index.php, вначале файла написан такой код:
<?php
if ('__AJAX__' == key($_GET)) {
define('AJAX', true);
array_shift($_GET);
} else {
define('AJAX', false);
}
Т.е. если была использована функция на javascript ajax(..), бекенд «знает», что происходит ajax запрос, фреймворк это учитывает в своей работе, что сокращает код приложения и упрощает работу с ним. А, именно: это дает возможность, по умолчанию отключить layout и style приложения, что соответствует наиболее частому случаю. В то время, как для обычных запросов, фреймворк подключает по умолчанию некоторые layout и style.
5. Подразумеваем, что фреймворк подменил error handler php с помощью функции PHP set_error_handler(..), аналогично можно работать с Exception. В случае ошибок при запросах AJAX, бекенд, вместо требуемого вывода в браузер, выдает JSON данные, где добавляется ключ «catch_error», например:
echo json_encode(['catch_error' => "$this->errors<h1>Stdout</h1>" . html($stdout)]);
Конечно, подмена вывода в браузер возможна, когда используется буферизация STDOUT с помощью функции PHP ob_start(). Если функция ajax(..), детектировала, что имеются JSON данные с ключом «catch_error», она показывает, например, всплывающее окно с ошибками. Естественно, режим с ошибками должен работать только в режиме отладки приложения.
Реализация описанного выше шаблона CSN-Ajax, может варьироваться по-разному, но в общем преимущества, которые можно получить:
а) Более короткий синтаксис ajax вызовов на javascript, привязка к контроллеру относительная к открытой странице.
б) Более короткий синтаксис обработки ajax вызовов в контроллерах, не нужно специально отключать layout.
в) Имеется автоматическая нотификация разработчика об ошибках при запросах ajax.
Вообще, одна из задач хорошего Framework, — работать как архиватор, часто используемый код, должен представляться коротким синтаксисом, что прекрасно отражено в вышеописанном шаблоне.
Спасибо за внимание!
Автор: coresky