AJAX в Joomla 2.5

    В статье рассмотрены вопросы использования 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.
    Метки:
    • –5
    • 21,1k
    • 8
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 8
    • +3
      Для полноты картины было бы неплохо взять и показать реализацию модуля. А так статья получилась жидковата.
      • 0
        Из текста понятно, что тот самый файл ajax.php из папки модуля это:
        1. запуск фреймворка
        2. обработка запроса
        3. отдача ответа

        Единственное необычное место это проверка, что запрос действительно пришёл через xmlhttprequest.
        Если в проекте много ajax-запросов, то для них можно сделать единую точку входа, в которой делать общую проверку на ajax/не ajax, запускать фреймворк и передавать управление в нужные файлы.
        • 0
          так не получится, в joomla нет общей точки входа для ajax и её туда не впилить. Каждый модуль это отдельная сущьность которую администратор сайт может включать, выключать, удалять. Если вы сами впилите туда общую точку входа то ваш модуль будет работать только у вас и никто его не сможет установить
          • 0
            Я говорил скорее о проектах, где решения создаются конкретно под нужды проекта, а не о разработке универсальных расширений для JED.

            Допустим, мы говорим про очень кастомные магазины. Основная логика (клиенты, заказы, товары, атрибуты) кочует как база из проекта в проект. Но в каждом из них сильно дорабатывается. В какой-то момент, становится понятно, что очень много действий выполняются аяксом. Действия эти, при чём, сильно разные, например работа с корзиной, сравнение товаров, фильтрация списков, пагинация и т.д. Следственно и точки входа получаются разные: где-то это вью компонента, где-то модули (почему-то), использующие апи компонентов. Когда таких точек накапливается много, становится удобно сделать одну точку входа с запуском фреймворка и фильтрацией входящих запросов (по white-листу, например) и передачей управления.

            то ваш модуль будет работать только у вас и никто его не сможет установить
            То, что нужно.

            так не получится, в joomla нет общей точки входа для ajax и её туда не впилить.
            Вообще общая точка входа есть, она же и точка входа для обычных запросов — это index.php. CMS предоставляет возможность обращаться к контроллерам компонентов без рендеринга общего шаблона. Но топик не об этом, а о том, как принимать запросы к модулям, где такого механизма нет и это совершенно правильно. Гораздо логичнее выглядит ситуация, когда модули используют API компонентов для получения данных. И ещё более естественно это выглядит когда модули поступают так же и при ajax-запросах.
            • 0
              Речь идет о разработке модуля для системы и если вы это делаете то должны соблюсти все правила которые эта систме предъявляет к модулю. Для чего это надо? Для того, чтобы ваш модуль работал с этой системой и не зависел от её обновления и прочего прочего.
              Если ваш модуль будет работать только на вашем сайте потмоу как вы наставляли костылей в index.php то зачем он вообще? Я против такого костылеписания, если вы работаете с системой делай все в том стиле который заложили разработчики.

              К справке в joomla модуль прекрасно может общаться с системой через апи компонента — это да, но для этого надо реализовать это апи, опять же если компонент не ваш то править чужой — идея плоха ибо при обновлении придется все корректировать.

              Разработка очень кастомных магазинов идет другими путями и я бы вообще в ней joomla не применял, да и вообще разработка кастомного продукта имеет свои особенности.
      • +1
        Текст до ката вызвал из памяти вступление к защищенному недавно диплому :) Лаконично
        За статью спасибо, пригодится
        • +1
          Слегка оффтоп:

          Когда люди говорят об ajax в Joomla, всегда рассказывают про component.php и почти никогда про view.raw.php и view.json.php. Эти файлы в компонентах являются точками входа наравне с view.html.php. В Joomla есть несколько типов генерируемых документов, кроме JDocumentHTML есть так же JDocumentRaw и JDocumentJSON (и другие), и именно они бывают полезнее для обмена данными (а не HTML-кодом) между клиентом и сервером.

          Это не в тему поста, но впечатление, что весь ajax в Joomla сводится к отдаче HTML-вывода компонента без общего шаблона сайта это не хорошо.
          • 0
            Поддержу вас, когда работал с джумла, пользовался данным способов и совсем не понимал когда некоторые кидают html по ajax даже там, где это не нужно. А на счет модулей они не так хорошо это продумали.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.