Joomla и AJAX

 

Какие возможности дает наш подход:

  • Использование Joomla API - это полезно, сильно упрощает жизнь разработчика и открывает доступ ко всем внутренним возможностям движка, а они огромны.
  • Чистый HTML-код, без замусоривания JavaScript - вставками.
  • Доступ к методам контроллеров и моделей любого установленного расширения, причем как к фронтенду так и к админской части.
  • Безопасность. При ипользовании штатных методов Joomla безопасность AJAX-расширения находится на уровне безопасности сайта в целом, то есть, не создается дополнительных дыр, что уже хорошо.

Я буду рассказывать на примере компонента

 

Итак, что надо сделать:

 

Добавляем AJAX-контроллер. В папку /components/com_mycomponent кладем файл, например, ajax.php примерно следующего содержания:

 

<?php 
    define( '_JEXEC', 1 ); //Так как это точка входа в движок, то определяем джумловую константу, требование безопасности Joomla
    define('JPATH_BASE', '../../' );//Определяем путь к корню сайта
    define( 'DS', DIRECTORY_SEPARATOR );//Определяем константу - разделитель
    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );//Подключаем файл с остальными константами
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );//Подключаем непосредственно framework
    require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );//Подключаем работу с БД
    JFactory::getApplication('site')->$mainframe->initialise();// Собственно, инициализируем приложение
?>

 

Теперь необходимо описать класс нашего контроллера. Можем сделать это в том же файле ajax.php

 

<?php
class myComponentAjax {//Просто класс, ни от чего не наследуем
    function __construct(){//Конструктор
        $jInput = JFactory::getApplication()->input;
        $task = $jInput->get('task','getParams','filter');//Получаем task стандартным джумловым способом
        if(!method_exists(__CLASS__,$task)){
            throw new Exception("Метод класса не найден");//Генерируем исключение, если метод $task не определен
        }
        $this->params = JComponentHelper::getParams('com_mycomponent'); //Вот так просто получаем все параметры компонента. В полном согласии с Joomla API
        $this->$task();//Вызываем задачу
    }
    
    function getParams(){//Просто метод класса. В дальнейшем будем вызывать его как задачу по умолчанию.
        $retArray = array('message'=>'','error'=>,result=>array()); //Определяем результирующий массив
        $retArr['result']['param1'] = $this->params->get('param1');
        $retArr['result']['param2'] = $this->params->get('param2');
        $retArr['result']['param3'] = $this->params->get('param3');
        echo json_encode($retArr);// Просто пишем в выходной поток json-кодированные данные.
    }
}
?>

 

Далее следует простой способ инициализации контроллера все в том же ajax.php:

 

<?php
try{
    $jax = new myComponentAjax();//Создаем экземпляр класса - контроллера
}
catch ($e){
    echo json_encode(array('error'=>$e));//Перехват исключения, если, например, некорректно были переданы данные с клиента
}
?>

 

Вот, собственно, вся серверная часть.

 

Что нам сделать с клиентской частью:

 

(примеры, как всегда для MooTools - люблю его :) )

Выносим работу с AJAX в отдельный файл: my_componenet.ajax.js


var myComponenetSettings=({});

window.addEvent('load',function(){
    var gP = new Request.JSON({
        url:'/components/my_componenet/ajax.php',
        method:'post',
        data:{
            task:'getParams'
        },
        onSuccess:function(jsn){
            if(jsn.message) console.log(jsn.message);
            if(jsn.error) alert(jsn.error);
            if(jsn.result) myComponentSettings = jsn.result;
        }
    }).send();
});

 

Теперь после загрузки страницы будет послан AJAX-запрос к файлу ajax.php, вызван метод getParams класса myComponentAjax, который вернет нам уже в JavaScript-переменную объект из трех параметров.