Аналогичная тема была неожиданно закрыта автором, но подобные вопросы периодически возникают, так что я попытаюсь описать варианты реализации AJAX в MODx. В связи с появлением и осмыслением новых материалов
сообщение исправлено.
Для начала напомню, что AJAX – это технология, при которой после загрузки страницы выполняется программа на JavaScript, которая обращается к серверу в интернете в асинхронном режиме. Сервер обрабатывает запрос и отсылает ответ, который программа на JavaScript может обработать, чтобы изменить содержимое страницы. При этом меняется только нужный фрагмент, а полная перезагрузка страницы не происходит.
В MODx возможны
три варианта использования AJAX, различающиеся тем, какую программу на PHP следует выполнить на сервере при асинхронном запросе и что в этой программе следует сделать.
1. При запросе на сервере выполняется
index-ajax.php. Примером такого варианта может служить сниппет AjaxSearch до версии 1.7 включительно, работающий в режиме AJAX. Особенностью варианта является минимизация дополнительных действий, выполняемых при асинхронном запросе, при этом среда MODx не загружается. Достоинства: высокая эффективность, не тратятся лишние ресурсы на сервере при запросе, ответ сервера будет получен быстрее. Недостатки: так как среда MODx не загружается, невозможно использовать API MODx и подгружать чанки, сниппеты и тому подобное.
2. При асинхронном запросе на сервере выполняется
index.php, как и при обычном запросе. Пример можно посмотреть
здесь, вариант Full MODx solution (полное решение MODx). Особенностью этого варианта является полноценный вызов MODx при каждом асинхронном обращении. Достоинства: способность использовать все средства MODx и в случае работы с AJAX. Недостатки: каждый асинхронный вызов требует значительных ресурсов сервера, что снижает эффективность и увеличивает время отклика сервера.
3. Промежуточный вариант подразумевает вызов через
index-ajax.php с частичной загрузкой ядра MODx. Этот подход используется в AjaxSearch версии 1.7.1 и описан в упоминаемой выше статье как вариант Lightweight solution (облегченное решение). Полноценное использование всех средств в этом режиме невозможно, но некоторые функции будут работать. По эффективности этот вариант расположен между двумя другими.
Дополнительно отмечу, что получить нужную информацию из базы данных при использовании первого метода достаточно просто, хотя и не получится использовать API MODx. Зная структуру базы и умея работать с PHP и MySQL, можно реализовать практически любую задачу. Если не нужно выполнять сложную обработку чанков, сниппетов и параметров, среду MODx при асинхронном запросе лучше не загружать. Однако оценка сравнительной эффективности всех трех вариантов достаточно сложна, так что выбор чаще делается на основе личных предпочтений.
Для третьего метода в программе рекомендуется выполнить следующие команды:
// Защита от некоторых опасностей при асинхронном вызове
require_once(MODX_MANAGER_PATH . '/includes/protect.inc.php');
// Установка режима MODx API
define('MODX_API_MODE', true);
// Инициализация парсера
include_once(MODX_MANAGER_PATH.'/includes/document.parser.class.inc.php');
$modx = new DocumentParser;
// Включение доступа к базе данных MODx
$modx->db->connect();
// Включение доступа к основным параметрам MODx
$modx->getSettings();