Pull to refresh

AJAX в Joomla 2.5

Ajax *CMS *
В статье рассмотрены вопросы использования AJAX в компонентах, модулях и плагинах Joomla.
Родная документация Joomla честно говоря не ахти и после того как ко мне обратились уже в надцатый раз с просьбой добавить Ajax в модули и плагины Joomla 2.5 я решил написать маленький топик на тему как это делается.
Вначале немного о структуре самой CMS: визуальный слой состоит из компонента и модуля, где компонент — это чаще всего основное содержание страницы, а модули — небольшие блоки информации, например на Хабре блоки справа (прямой эфир, Q&A) — модули, а основное содержимое страницы, например, текст топика с комментариями либо лента постов — компонент.

На рисунке красным выделы модули, синим — компонент
Ко всему выводу страницы применяются плагины. Это могут быть скрыватели электронной почты, которые заменяют электронный адрес на картинку или javascript, подсветка кода, заменяющая всё в теге <code>.
Если вам необходимо использовать асинхронные запросы в компоненте (основном содержании сайта), то тут CMS предоставляет такую возможность. Если у вас есть некоторый компонент, допустим поиск по гостиницам, в котором вы хотите реализовать быструю асинхронную фильтрацию по некоторым параметрам, то вы можете просто добавив к строке адреса «tmpl=component» получить только вывод компонента.

Та же страница, что и на первом рисунке, но без модулей, только вывод компонента.
Не нужно думать, что tmpl=component — это какая-то магия или хак, для каждого компонента или модуля вы можете делать неограниченное число шаблонов и применять их в зависимости от каких-либо условий.
Итак, если нам нужно добавить AJAX к компоненту мы просто вызываем страницу компонента с определенным параметром и на возвращаются, в нашем случае, список гостиниц по определенному фильтру, мы заменяем их в списке, который видит на экране пользователь.
Но если нам предстоит добавить какую-либо аналогичную функциональность в модуль, то придется делать некоторые финты ушами. Основное отличие компонента от модуля, компонент — самостоятельная единица содержимого, в то время как модуль это лишь какая-то дополнительная информация на странице.
Мы можем получить отдельно содержимое компонента, например вызвать из одного компонента лайтбокс с содержимым другого компонента, а с модулем этого не получится, поэтому нам придется обращаться напрямую по пути файла, например если у нас есть маленький модуль со списком гостиниц, то URI для AJAX-вызова будет примерно /modules/mod_test/ajax.php?action=getHotelList&city=Moscow.
Но чтобы иметь внутри этого файла доступ к Joomla Framework нам необходимо подключить определенные файлы и определить некоторые константы:
define('_JEXEC', 1);

_JEXEC проверяется в большинстве других файлов CMS для минимального подтверждения того, что файл вызывается внутри фреймворка.
define('JPATH_BASE', dirname(__FILE__) . '/../../..' );

JPATH_BASE — константа в которой хранится путь до основной директории сайта. Так как мы находимся не в корне сайта, а в папке с каким-либо плагином или модулем, то нам необходимо добавить к пути до текущего файла «поднятие» на несколько уровней вверх.
define('DS', DIRECTORY_SEPARATOR);
require_once(JPATH_BASE.DS.'includes'.DS.'defines.php');
require_once(JPATH_BASE.DS.'includes'.DS.'framework.php');

После определения пути мы должны аналогичным index.php файлу CMS подключить основные файлы фреймворка.
JFactory::getApplication('site')->initialise();

После инициализации приложения мы можем обращаться к API фреймворка и выполнить то, что нам необходимо, например проверить имеет ли текущий пользователь доступ к просмотру списка гостиниц, получить из базы список и вернуть его в виде HTML-кода или JSON.
Tags:
Hubs:
Total votes 17: ↑6 and ↓11 -5
Views 22K
Comments Comments 8