Ajax-запросы к модулям и плагинам (и кастомным компонентам)

Анатомия AJAX запроса

Требуется

  • option=com_ajax
  • [module|plugin]=name
  • format=[json|debug|raw]

Опционально

  • method=[custom fragment] по умолчанию становится get, если не указано.

Обзор

Все запросы начинаются с ?option=com_ajax, который вызывает это расширение, должны содержать в себе тип расширения для вызова и формат возвращаемых данных.

Дополнительные переменные и значения, используемые вашим расширением также могут быть включены в URL.

Например запрос к ?option=com_ajax&module=session вызовет mod_session с результатами, возвращенными в формате по умолчанию. Код ?option=com_ajax&plugin=session&format=json вызовет метод onAjaxSession плагинов с выводом результата в JSON.

Детали

Запросы плагинов должны включать в себя переменнуюplugin в URL в паре с событием плагина, например plugin=session для onAjaxSession.

Это значение также используется для:

  • Имени класса плагина, который следует соглашению plgAjax[Name]
  • Имени функции, которая следует соглашению onAjax[Name]/
  • Группа плагинов по умолчанию ajax. Вы можете сменить её, указав параметр запроса group (начиная с Joomla! 3.4).

 

Запрос к кастомным компонентам

Параметры запроса примерно такие: index.php?option=com_catalog&task=getAjax&action=methodname.

При этом в главном контроллере должен быть прописан метод getAjax:

public function getAjax()
{
    $input = JFactory::getApplication()->input;
    $model = $this->getModel( 'ajax' );
    $action = $input->getCmd( 'action' );
    $reflection = new ReflectionClass( $model );
    $methods = $reflection->getMethods( ReflectionMethod::IS_PUBLIC );
    $methodList = array();
    foreach ( $methods as $method ) {
        $methodList[] = $method->name;
    }
    if ( in_array( $action, $methodList ) ) {
        $model->$action();
    }
    exit;
}

А в модели ajax должен быть метод methodname:

public function methodname(){
    try{
        $result = 'answer';
        
        echo new JResponseJson($result);
    }catch(Exception $e){
        echo new JResponseJson($e);
    }
    exit;
}