Про AJAX в модулях Joomla 3+
Данный пост повествует о том, как правильно отправлять AJAX запросы в модулях Joomla 2.5 и 3+ версии. В joomla для отправки ajax запросов был создан компонент com_ajax, который позволяет отправлять ajax запросы в joomla из вашего модуля, с ним мы и будем работать.
Данный пост подразумевает, что у вас уже есть некий компонент, в который вы собираетесь встраивать AJAX функционал. Если вы только собираетесь создавать модуль, я отступлю и расскажу про подводные камни в Joomla 3.
1. Если ваш модуль имеет в названии нижнее подчеркивание ( пример mod_webislife_contact_form) вам необходимо установить патч для Joomla т.к. в ней присутствует баг по обработке AJAX запросов у модулей с таким названием, подробнее прочитать про данный баг #32166 можно тут. Второй вариант решения, использовать название без подчеркиваний, если вы собираетесь распространять свой модуль в сети.
Теперь перейдем непосредственно к отправке AJAX запроса через компонент com_ajax. Чтобы выполнить запрос, мы должны методом GET или POST обратиться к компоненту com_ajax. Нам следует указать несколько обязательных параметров
module — мы должны указать название нашего модуля без нижнего подчеркивания и приставки mod ( прим. mod_webislife_contact_form => webislifecontactform ) для плагинов в место module следует использовать переменную plugin
format — формат получаемых данных, доступны варианты raw, json и debug
option — должен быть указан com_ajax
method — не обязательный параметр, указывающий на принимающий данные метод
Пример строки отправки данных для GET запроса
webislife.ru/index.php?option=com_ajax&format=debug&module=webislifecontactform&data=‘что-нибудь’
А теперь пример отправки данных через POST с использованием jQuery
jQuery(document).ready(function($){ $('#button').on('click', function(){ $.ajax({ type: 'POST', dataType: 'json', url: 'index.php', //в отличии от GET запроса не будем писать тут лапшу в url data: { option: 'com_ajax', module: 'webisliecontactform', format: 'json', mydata: 'что-нибудь еще...' }, success: function(data, status) { }, error: function(data, status) { } }); }); });
Теперь нам необходимо как-то принимать и обрабатывать данные в модуле. Для этого необходимо создать helper.php файл и положить его в корень с вашим модулем. В файле мы должны объявить имя класса строго по схеме mod+Имямодуля+Helper, если у вас есть нижние подчеркивания в названии модуля, то после каждого подчеркивания необходимо ставить заглавную букву. В нашем классе по умолчанию должен быть один метод getAjax который и будет заниматься приемом и обработкой данных, приведу пример
<?php class modWebislifeajaxformHelper { public static function getAjax() { jimport('joomla.application.module.helper'); //подключаем хелпер для модуля $input = JFactory::getApplication()->input; //Далее просто получаем данные $name = $input->getString('name', ''); $contact = $input->getString('contact', ''); $message = $input->getString('message', ''); return true; //вы можете что-нибудь вернуть в ответ } }
Если вами был указан параметр method, то в helper.php следует давать ему название Method+Ajax, т.е. добавлять к названию метода Ajax приставку в конце.
На этом казалось бы все, просто и ясно. Осталось лишь придумать, что отсылать. Но есть еще одни подводный камень, при отправке запроса из модуля вы можете получить сообщение вида
LogicException: Module ваш_модуль is not published, you do not have access to it, or it’s not assigned to the current menu item
Для этого необходимо при публикации модуля указать параметр отображения на страницах «На всех кроме выбранных» (On all pages except those selected) Тогда отправка должна происходить без проблем, если вы все-таки хотите показывать модуль только на определенных страницах и с них посылать запросы, то к вашему запросу необходимо будет добавить значение itemid, присвоенного меню.
На этом все, будут вопросы, пишите. Почитать официальную документацию Joomla на тему ajax можно тут.