Размещение AJAX в модуле Joomla

Я сделал базовый модуль Joomla для своего сайта в качестве чата. Но я хотел бы поместить в него AJAX (я знаю, что аналогичный модуль с AJAX уже существует в JED, но это больше проект для меня, чтобы узнать, как AJAX работает в модуле Joomla).

Обычный материал AJAX, когда вы перенаправляете на новый файл php, очевидно, не работает, поскольку файл не будет определен как

   defined('_JEXEC') or die('Restricted access');

не получится на новой странице. И определение _JEXEC равным единице (как я читал в нескольких постах на SO), насколько я читал в Документах Joomla, представляет собой угрозу безопасности, поскольку обеспечивает точку входа на сайт.

Способ другого модуля чата, который я видел, указывает на в файле helper.php. Это имеет смысл для меня, поскольку именно здесь обычно должны храниться все функции. Однако мне неясно, как модуль обращался к файлу helper.php с помощью команды onSubmit() (или связанной с ней) и надеялся, что кто-то сможет пролить свет на это.

На самом деле мне не нужно ничего конкретного для моего модуля Shoutbox - это больше вопрос о том, как получить функциональность AJAX в модулях Joomla и как это устроено.


person George Wilson    schedule 19.11.2012    source источник


Ответы (5)


Два других были на правильном пути, вам нужно помнить, что когда вы делаете вызов AJAX, вы не можете напрямую получить доступ к файлу php в Joomla. Поэтому вместо этого лучше делать вызовы в ваш модуль. В этом случае и пусть модуль проверяет переменные в вашем POST или в URL-адресе.

Я большой поклонник ajax JQuery, он гораздо более автономен, чем метод, который использовал парень, который построил этот чат.

$( "#addShout" ).click( function(event, ui) {
                $.ajax({
                    type: 'GET',
                    url: "<?php echo JURI::base() . "index.php?option=mod_mymodule&task=getCustomerJson&selectedCustomer="?>"  + encodeURIComponent(value),
                    success:function(data){
                        $('#shouts').append(data);
                    },
                    error:function(){
                        $('#errors').html('<p class="error"><strong>Oops!</strong> Try that again in a few moments.</p>');
                    }
                });  
        });

Тогда, как я упомянул в своем комментарии к Валентину, вы:

$task = JRequest::getVar('task'); 
if($task == "getCustomerJson"){mySuperHelper::getCustomerJson();}

Вы вызываете только необходимые функции, когда существуют переменные.

Чтобы объяснить часть процесса, это примерно так:

  1. Если в POST или URL нет переменных, он просто отобразит модуль так, как ожидает Joomla.
  2. Если переменная обнаружена, вызовите метод, чтобы добавить ее в базу данных, и функцию javascript, которая добавит ее на дисплей. Также предотвратите нормальное отображение.

Модуль, на который вы ссылались, был довольно интересным. Вспомогательные функции, на которые ссылается основной файл, делают то, что модель обычно обрабатывает в MVC, и Javascript также был повсюду. Если вы действительно хотите понять, как это работает, вам действительно нужно покопаться в файле fatAjax.js, так как он содержит все AJAX и устанавливает переменные, которые слушает mod_shoutbox.php.

person Cleanshooter    schedule 20.11.2012
comment
Просто к вашему сведению, у меня наконец-то появилось время, чтобы реализовать это, и поэтому я представил несколько настроек, которые мне нужны, чтобы заставить его работать! Еще раз спасибо за пост :) - person George Wilson; 23.04.2013
comment
@Cleanshooter Привет, Джо, могу я попросить тебя обратить внимание на мой новый вопрос? stackoverflow.com/q/49422168/2943403 - person mickmackusa; 22.03.2018

Для Joomla 3.2, если вам нужно было сделать запрос AJAX в Joomla! из пользовательского модуля или плагина вы можете создать URL-адрес, как показано ниже.

index.php?option=com_ajax&module=your_module_name&method=YourMethodName&format=json

Объяснение каждого параметра

<сильный>1. index.php?option=com_ajax : ВСЕ запросы должны направляться через com_ajax.

<сильный>2. module=your_module_name: первая часть — это тип расширения, которое вы используете. Это может быть либо «модуль», либо «плагин». Вторая часть — это имя расширения. пожалуйста, следите за тем, чтобы вы не включали префикс 'mod_' или 'plg_', а только имя.

<сильный>3. method=YourMethodName: это имя метода, который вы пытаетесь вызвать. Если вы используете это в модуле, метод должен быть дополнен «Ajax». Таким образом, представленный здесь метод будет YourMethodNameAjax. Если вы используете это в плагине, метод должен начинаться с «onAjax». Таким образом, представленный здесь метод будет onAjaxYourMethodName.

Дополнительные сведения см. в документе по Joomla.

person aMoL Thite    schedule 14.04.2017

Насколько мне известно, вы не можете выполнять вызовы AJAX из модуля в функцию в самом модуле (или аналогичном).

Вы можете создать компонент и создать представление, которое возвращает RAW или JSON в качестве ответа. Потому что Джумла! будет называться вы можете использовать Joomla! API и все плюсы от него. Это также связано с безопасностью, потому что, если вам нужно получить конфиденциальные данные, вы также можете выполнить проверку ACL/пользователя.

Когда вы можете вызвать из модуля что-то вроде:

index.php?option=com_mycomponent&task=getJson

Статья Создание вывода JSON является хорошей отправной точкой.

person Valentin Despa    schedule 19.11.2012
comment
Я думаю, что этот модуль работает :) Я согласен делать это через компонент - так намного проще, как вы говорите. extensions.joomla.org/extensions/communication/shoutbox/43 - person George Wilson; 19.11.2012
comment
Вы можете просто выполнить $task = JRequest::getVar('task'); если($task == getJson){mySuperHelper::getJson();} - person Cleanshooter; 20.11.2012

Добиться желаемого результата можно следующим образом:

$( "#addShout" ).click( function(event, ui) {
    $.ajax({
        type: 'GET',
        url: "<?php echo JURI::base() . "index.php?option=com_ajax&module=module_name_withot_prefix&method=methodName&anyparams="?>"  + encodeURIComponent(anyparamsvalue) + "&format=json",,
        success:function(data){
            $('#shouts').append(data);
        },
        error:function(){
            $('#errors').html('<p class="error"><strong>Oops!</strong> Try that again in a few moments.</p>');
        }
    });  
});

В вспомогательном файле модуля вам понадобится метод с именем «methodName».

person Syed Husain Ahmad    schedule 26.08.2020

person    schedule
comment
Но можете ли вы заменить com_componentname на mod_modulename и добавить в доступ функцию в классе helper.php? Как я уже сказал, это доступ к модулю, а не к функции компонента. Я добавил ссылку JED на модуль, который пытался понять в своем исходном сообщении. - person George Wilson; 19.11.2012