Создание простого модуля для Joomla 4.x. Разработка базового модуля — Часть 1
Введение в написание собственного модуля для Joomla 4
Вы можете увидеть множество примеров модулей в стандартной установке Joomla. Например:
- Меню
- Последние Новости
- Форма входа в систему
- и многое другое.
В этом уроке будет объяснено, как создать простой модуль для Joomla 4. Из этого урока вы узнаете основную файловую структуру модуля Joomla 4. Затем эту базовую структуру можно расширить для создания более сложных модулей.
Структура файлов модуля для Joomla 4
Существует несколько основных файлов, которые используются в стандартном шаблоне разработки модуля:
- mod_foo.php
- Этот файл является основной точкой входа для модуля. Он выполнит все необходимые процедуры инициализации, вызовет вспомогательные процедуры для сбора любых необходимых данных и включит шаблон, который будет отображать вывод модуля.
- Этот файл содержит информацию о модуле. Он определяет файлы, которые необходимо установить с помощью установщика Joomla и задает параметры конфигурации для модуля.
- Это шаблон модуля. Этот файл будет содержать данные, собранные mod_foo.php и сгенерирует HTML-код, который будет отображаться на странице сайта в месте его вывода.
- Это файлы, которые предоставляют текст на английском языке Соединенного Королевства Островного Государства.
Создание mod_foo.php
Код в mod_foo.php файле будет выполнять следующие задачи:
- Импортирует класс ModuleHelper в текущую область.
- Он нам понадобится позже для отображения выходных данных.
Вспомогательный класс импортируется в нашу текущую область в начале файла.
use Joomla\CMS\Helper\ModuleHelper;В конце включаем шаблон для отображения выходных данных через:
require ModuleHelper::getLayoutPath('mod_foo', $params->get('layout', 'default'));Код файла mod_foo.php
Код файла mod_foo.php выглядит следующим образом:
* @copyright [COPYRIGHT] * @license GNU General Public License version 2 or later; see LICENSE.txt * @link [AUTHOR_URL] */ // Но пасаран шарахающим сучностям! defined('_JEXEC') or die; use Joomla\CMS\Helper\ModuleHelper; require ModuleHelper::getLayoutPath('mod_foo', $params->get('layout', 'default'));Примечаниеː
В Joomla 3.x вы обычно использовали строку типа $moduleclass_sfx = htmlspecialchars($params->get(‘moduleclass_sfx’)); . Теперь это больше не нужно. Зыкните по этой ссылке, если любопытно: https://github.com/joomla/joomla-cms/pull/17447.Одна строка, которую мы до сих пор не объяснили, — это первая строка defined(‘_JEXEC’) or die; . Эта строка проверяет, включен ли этот файл из приложения Joomla и исключает его запуск вне CMS Joomla. Это необходимо для предотвращения введения переменных и других потенциальных проблем безопасности, проблем с безопасностью и опасными проблемами.
Создание tmpl/default.php
Код файла default.php — это шаблон, который отображает вывод модуля на сайт или в админку Joomla.
Код файла tmpl/default.php
Код файла tmpl/default.php выглядит следующим образом:
* @copyright [COPYRIGHT] * @license GNU General Public License version 2 or later; see LICENSE.txt * @link [AUTHOR_URL] */ // Всем кыш, кто пришёл не через парадный вход! defined('_JEXEC') or die; echo '[PROJECT_NAME]';Важно отметить, что файл шаблона имеет ту же область действия, что и mod_foo.php . Это означает, что переменная может быть определена в mod_foo.php файл, а затем используется в файле шаблона без каких-либо дополнительных объявлений или вызовов функций.
Создание mod_foo.xml
Код файла mod_foo.xml — это установочный код для внедрения в CMS Joomla 4. Большинство записей не требуют пояснений (Прим.переводчика: ибо лень их пояснять).
Код файла mod_foo.xml
Код файла mod_foo.xml выглядит следующим образом:
MOD_FOO [ДАТА] [АВТОР] [ПОЧТА_АВТОРА] [URL_АВТОРА] [ПРАВАЯ_КОПИЯ] GNU General Public License version 2 or later; see LICENSE.txt 1.0 MOD_FOO_XML_DESCRIPTION mod_foo.php tmpl language mod_foo.xml Создание языковых файлов модуля для Joomla 4
Файлы language/en-GB/mod_foo.ini и language/en-GB/mod_foo.sys.ini используются для перевода текста во внешнем интерфейсе (на сайте) и в бэкэнде (в админке). Обратите внимание, что структура языковых файлов была обновлена в Joomla 4 и языковые префиксы для отдельных файлов в языковой папке больше не требуются.
Код для language/en-GB/mod_foo.sys.ini выглядит следующим образом:
MOD_FOO="[PROJECT_NAME]" MOD_FOO_XML_DESCRIPTION="Foo Module"Код для language/en-GB/mod_foo.ini выглядит следующим образом:
MOD_FOO="[PROJECT_NAME]" MOD_FOO_XML_DESCRIPTION="Foo Module"Файл .sys.ini используется для перевода описания расширения при установке, а языковые константы из .ini используются для перевода остальных строк и описания при просмотре вашего расширения (в текущем контексте — модуля).
Более подробную информацию о языковых файлах можно не найти здесь.
Вы читаете статью из небольшого цикла:
«Создание простого модуля для Joomla 4.x»- «Вступление»
- «Разработка базового модуля для CMS Joomla 4 — Часть 1»
- «Тестирование и Отладка первой части написанного модуля для Joomla 4»
- «Тестирование и Отладка второй части написанного модуля для Joomla 4»
- «Тестирование и Отладка третьей части написанного модуля для Joomla 4»
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! 😉Создаём модуль для Joomla
Обычно функции модулей довольно простые.
Это вывод чего либо на сайте: виджет группы, слайдер, соц.кнопки, карта Яндекса, форма заявки и т.д.
Т.е. здесь не нужны массовые вычисления.Поэтому можно взять что-то готовое и немного изменить под задачи.
К примеру, когда я делал свой первый модуль для Joomla, то взял готовый скрипт формы обратной связи.
Он был уже протестирован и код его был очень простой.
3 поля и кнопка отправить + скрипт который получал данные из формы и отправлял их при помощи функции mail()Мы с вами тоже не пойдём в дебри, и возьмём готовый код виджета Вконтакте, который выводит кнопку «Напишите нам».
Код виджета можно получить здесь — https://vk.com/dev/ContactUsИз настроек тут только ID группы.
Чтобы людям было проще, разработчики ВК сделали поле для ссылки на группу.
Обычная ссылка на группу выглядит так — https://vk.com/club27841519
Где 27841519 — это ID группы.Мы тоже сделаем такое поле, но не для URL адреса группы, а для её ID.
Чтобы не заморачиваться с получением ID из ссылки, будем сразу указывать ID.Мы будем подставлять в код виджета переменную из нашего поля, пусть она будет называться $group_id
На этом подготовка (и продумывание) главного функционала готово)
Конечно, если взять даже простую форму обратной связи, о которой я говорил выше, то там будет больше кода, и будет немного сложнее.
Но сейчас самое главное я хочу показать принцип создания модулей для Joomla.Подготовка файлов для модуля Joomla
Для работы модуля нужно несколько системных файлов.
Но для начала давайте дадим название этому модулю. Пусть это будет vk_contactus
От этого названия и будем отталкиваться при создании файлов.
Создаём папку vk_contactus и в ней файлы:
mod_vk_contactus.php — основной файл модуля. Как видите у него есть приставка mod_
Такая приставка используется для модулей.
В этом файле можно подключить JS скрипты, CSS файлы и включить некоторые другие опции.mod_vk_contactus.xml — это xml файл настроек модуля и параметров при его установке
ru-RU.mod_vk_contactus.ini — перевод языковых констант на русский язык.
КОНСТАНТА=»русский перевод, каждый с новой строки, без запятых»
ru-RU.mod_vk_contactus.sys.ini — перевод системных языковых констант на русский (обычно этот файл пустой).
Можно создавать дополнительные языковые файлы, например en-GB.mod_vk_contactus.ini — для английского перевода.
Если будет несколько переводов, то удобнее положить их в папку language.Далее создаём папку tmpl — она нужна для хранения шаблонов (макетов) модуля.
default.php — это собственно файл с шаблоном модуля. Он у нас будет один, больше нам и не надо.
Скачать архив файлов для создания модуля можно по этой ссылке.
В файлах уже приведён некотрый код для примера.Либо в конце можно скачать готовый модуль.
В каждом php файле нужно указать defined(‘_JEXEC’) or die;
Это запрет на прямое обращение к файлу извне.Файл настроек давайте разберём подробнее.
XML файл настроек
xml version — версия xml документа и кодировка.
extension — тип расширения, в данном случае — модуль.
Ещё тут указывается версия joomla, client — это site или admin (сайт или админка) и метод установки — upgrade позволяет устанавливать новую версию модуля поверх старой. Это удобно, если вы постоянно обновляете свой модуль.
name — название модуля
author — имя автора модуля
creationDate — дата создания
license — тип лицензии
authorEmail — емейл автора
authorUrl — сайт автора
version — версия расширения
description — краткое описание модуля, здесь можно указать языковую константу, и потом в языковых файлах перевести её на нужный язык.
В блоке files указываются файлы и папки модуля.
filename — имя файла (для главного файла модуля добавляется module=»его название», смотри пример в файле)
folder — имя папкиВ блоке languages указываются языковые файлы
Если языковые файлы лежат без папки, то folder=»language» не указывается.В блоке config записываются поля для настройки модуля.
fields — Блок с полями для ввода параметров
fieldset — вкладка с полями, где name — название вкладки
field — поле с параметрами.
Будет лучше, если вы сами посмотрите этот файл и разберёте его содержимое.
А сейчас немного о типах полей.Типы полей для ввода настроек
По сути, это обычные поля типа input, select и т.д.
Просто в Joomla они называются немного по другому.Полный список полей можно посмотреть в документации
Мы добавим одно поле, в котором будем указывать ID группы ВК.

И разберём что здесь.
- name — уникальное имя поля
- type — тип поля (текстовое, выпадающий список, выбор цвета и т.д.)
- default — значение поля по-умолчанию (необязательное)
- label — подпись поля, я указал языковую константу
- description — всплывающая подсказка (необязательное)
В документации по ссылке выше указаны все типы полей, посмотрите.
Внедрение функционала в модуль
Модуль простой, поэтому внедрение тоже простое.
Главный файл модуля mod_vk_contactus.php
В главном файле модуля мы указываем:
$document = JFactory::getDocument();
это нужно для подключения css и js файлов в шапку сайта (head).
Это нужно не всегда, как и в нашем случае, но пусть будет на всякий пожарный.
И так же расскажу как подключаются файлы. Вдруг вы будете создавать модуль по-сложнее.CSS файлы подключаются так:
$document->addStyleSheet(JURI::base() . 'modules/mod_vk_contactus/css/default.css');
Где modules/mod_vk_contactus/css/default.css — это путь до css файла.
JS файлы подключаются так:
$document->addScript(JURI::base().'modules/mod_vk_contactus/js/script.js');
где modules/mod_vk_contactus/js/script.js — путь до js файла.
Кроме подключения файлов, нужно ещё включить суффикс класса модуля, для него есть специальное поле в настройках каждого модуля.
Он нужен для кастомизации внешнего вида модуля. Суффикс включается этой строчкой:$class_sfx = htmlspecialchars($params->get('class_sfx'));И в самом конце подключаем шаблон (макет) модуля. Это файл default.php в папке tmpl
Делаем это вот такой строкой:require JModuleHelper::getLayoutPath('mod_vk_contactus', $params->get('layout', 'default'));При разных условиях, могут быть разные макеты.
Файл макета default.php
Здесь мы объявляем переменную и вставляем код виджета.
Переменная, в неё пишем значение из поля ID группы
$group_id = $params['group_id'];
Код виджета, со вставкой переменной $group_id:

Тестирование
Здесь настроек почти нет, и функционал прост, поэтому на тестирование уйдёт всего пара минут)
Если же вы создаёте более сложный модуль, то обязательно тестируйте его на ПК и на мобильных, при разных условиях, и в разных браузерах.
На этом всё, спасибо за внимание.
Готовый модуль можно скачать тут >>Можете разобрать код других наших модулей, ради благого дела я не против)
С уважением, Олег Касьянов.
Разработка базового модуля
Данная серия материалов написана о том, как разработать какой-либо модуль для Joomla! в версии . Вы можете пройтись по материалам этой серии с помощью выпадающего навигационного меню.
Начните со вступления и пройдитесь по материалам этой серии с помощью либо расположенной внизу навигационной кнопки, либо расположенного справа навигационного текстового блока (Материалы в этой серии).
Модули представляют собой легкие и гибкие расширения. Они используются для малых кусочков страницы, которые, как правило, менее сложные и могут быть замечены вокруг разных компонентов.
Вы можете увидеть много примеров модулей в стандартной установке Joomla!: — Меню — Последние Новости — Форма входа — и многое другое.
Этот учебник объяснит, как создать простой модуль «Привет мир». С помощью данного руководства вы узнаете основную файловую структуру модуля. Затем эта базовая структура может быть расширена, чтобы произвести более сложные модули.
Файловая Структура
Существует четыре основных файла, которые используются в стандартном шаблоне разработки модуля:
- mod_helloworld.php — этот файл и является основной точкой входа для модуля. Он будет выполнять все необходимые процедуры инициализации, вызова вспомогательных средств для сбора необходимых данных а также шаблон, который будет отображать вывод модуля.
- mod_helloworld.xml — этот файл содержит информацию о модуле. Он определяет файлы, которые должны быть установлены установщиком Joomla! и задает параметры конфигурации модуля.
- helper.php — этот файл содержит вспомогательный класс, используемый для того, чтобы сделать фактическую работу в получении информации, которая будет отображаться в модуле (как правило, из базы данных или другого источника).
- tmpl/default.php — это шаблон модуля. Этот файл будет принимать данные, собранные mod_helloworld.php и генерирует HTML, который будет отображаться на странице.
Создание mod_helloworld.php
Файл mod_helloworld.php будет выполнять три задачи:
- включает файл helper.php который содержит класс, который должен быть использован для того чтобы собрать необходимые данные
- вызывает соответствующий метод вспомогательного класса, чтобы получить данные
- включает шаблон для отображения результата.
Вспомогательный класс определяется в нашем файле helper.php . Этот файл включается выражением require_once:
require_once dirname(__FILE__) . '/helper.php';
require_once используется потому, что наши вспомогательные функции определяются внутри класса, а мы хотим чтобы класс объявлялся только один раз.
Наш вспомогательный класс, пока еще не был определен, но, когда он появится, он будет содержать один метод: getHello(). Для нашего простого примера, на самом деле не надо этого делать — сообщение “Привет, мир!” , которое этот метод возвращает может быть просто включен в шаблон. Здесь мы используем вспомогательный класс, чтобы продемонстрировать эту базовую технику.
В настоящее время наш модуль не использует никаких параметров, но мы будем передавать их в любом случае во вспомогательный метод, так что они могут быть использованы позже, если мы решим расширить функционал нашего модуля.
Метод вспомогательного класса вызывается следующим образом:
$hello = modHelloWorldHelper::getHello($params);
Полный файл mod_helloworld.php
Полный файл mod_helloworld.php выглядит следующим образом:
Единственная строка, которую мы до сих пор не объяснили — это первая строка. Эта строка проверяет, чтобы этот файл включался через приложение Joomla!. Это необходимо, чтобы предотвратить инъекции переменных и другие потенциальные проблем безопасности.
Создание helper.php
Файл helper.php содержит вспомогательный класс, который используется для извлечения данных, которые будут отображаться при выводе модуля. Как говорилось ранее, наш вспомогательный класс будет иметь один метод: getHello(). Этот метод будет возвращать сообщение ‘Привет, мир’.
Вот код файла helper.php :
Нет правила, гласящего, что мы должны назвать наш вспомогательный класс так, как он назван у нас, но делать так — это полезно, чтобы его можно было легко идентифицировать и обнаружить. Обратите внимание, что название должно быть в таком формате, если вы планируете использовать плагин com_ajax.
Более сложные модули могут включать в себя запросы к базе данных или другие функции во вспомогательном методе класса.
Создание tmpl/default.php
Файлdefault.php это шаблон, который выводит модуль.
Код для файла default.php выглядит следующим образом:
Важный момент, который следует отметить, это то, что файл шаблона имеет ту же область видимости, что и файл mod_helloworld.php . Это означает, что переменная $hello может быть определена в файле mod_helloworld.php, а затем использоваться в файле шаблона, без каких-либо дополнительных объявлений или вызовов функций.
Создание mod_helloworld.xml
Файл mod_helloworld.xml используется, чтобы указать файлы, которые установщик должен скопировать и он используется Менеджером Модулей, чтобы определить, какие параметры используются для настройки модуля. Другая информация о модуле также указывается в этом файле.
Код mod_helloworld.xml выглядит следующим образом:
Hello, World! John Doe 1.0.0 A simple Hello, World! module. mod_helloworld.xml mod_helloworld.php index.html helper.php tmpl/default.php tmpl/index.html файлы Манифеста объясняют технические детали элементов, используемых в XML-файле.
Вы заметите, что есть два дополнительных файла, которые мы еще не упоминали: index.html и tmpl/index.html. Эти файлы добавлены для того, чтобы содержимое папок, в которых они расположены не могло быть просмотрено. Если пользователь попытается открыть в своем браузере эти папки — будет отображаться файл index.html. Эти файлы могут быть пустыми или могут содержать простую строку:
который будет отображать пустую страницу.
Так как наш модуль не использует поля формы раздел config пуст.
Installing and Viewing the Module
To install the module, zip up the parent directory of your source files, to create a file called mod_helloworld.zip. Note that it needs to be a .zip file because the server needs to be able to extract it using Apache’s mod_zlib library. Go into Joomla admin, to the Extensions / Manage / Install form, click on the Update Package File tab, and upload your zip file. You should find that the module installs ok. If it doesn’t, then compare carefully your code with the code above, and ensure your source code files are named correctly. To make the module visible on your site web pages go into the Extensions / Modules listing and click on the Hello World module to edit it.
- set the Status to Published
- select the Position where the module should appear (if you’re unsure about which Position to set, then navigate to Extensions / Templates / Styles, check which template is assigned on your web pages, then follow this guide to finding the module positions).
- on the Menu Assignment tab set the Module Assignment to «On all pages»
Save and Close your edit form. Now if you navigate to your site you should see «Hello, World!» displayed in your chosen module position.
Заключение
Разработка модуля для Joomla! это довольно простой и понятный процесс. Используя методы, описанные в этом учебнике, бесконечное разнообразие модулей может быть разработано без особых хлопот.
Создание модулей с учётом новой структуры Joomla 4
Joomla 4 «под капотом» претерпела немало изменений относительно предыдущих версий. Её кодовую базу сообщество разработчиков регулярно подтягивают до современных реалий, вводя актуальные технологии в ядро CMS. Так, например, если раньше загрузка классов была вариациями на тему include, то в Joomla 4 появился лоадер, приведённый к PSR-4. Ядро CMS переводится на концепцию сервис-провайдеров, внедрены DI-контейнеры, переработанная система событий для плагинов позволила увеличить производительность при генерации страниц более чем в два раза. Эти изменения влекут за собой изменения в структуре компонентов, модулей и плагинов.
В данной статье пойдёт речь о том, как создать модуль для Joomla 4 с новой структурой файлов и классов. К слову сказать, legacy ещё работает и многие расширения, созданные по канонам Joomla 3 (а не работавшие на Joomla 3, но написанные по канонам Joomla 1.5) ещё долго будут работать на Joomla 4.
Отступление
Я предполагаю, что часть читателей имеет опыт работы с Joomla, но не имеет опыта создания модулей, поэтому постараюсь описать создание модуля как можно подробнее. Статья имеет сугубо прикладной характер, без погружения в теорию ООП и его реализацию в Joomla. Основная цель — подсказать что «делать руками», когда поставлена определённая задача.
Рассказывать о создании модуля я буду на примере своего модуля WT Yandex map items — модуля вывода материалов Joomla на Яндекс.карты по координатам из пользовательских полей, который создавался под проект на Joomla 4, поэтому названия файлов, классов и namespace будут содержать название именно этого модуля. При создании своего модуля, естественно, нужно изменить их на свои.
Файловая структура модуля Joomla 3 vs Joomla 4 и распределение функционала
Было (Joomla 3)

Для создания модуля было необходимо как минимум 3 файла:
- mod_wtyandexmapitems.xml — описание модуля для установщика расширений Joomla (системное имя, дата, версия, сайт разработчика и т.д.), параметры конфигурации, сервер обновлений и т.д.
- mod_wtyandexmapitems.php — «точка входа» в модуль. С этого файла начинается работа Вашего кода.
- tmpl/default.php — макет вывода для модуля. Здесь находится HTML-вёрстка Вашего модуля. При необходимости, можно скопировать и переименовать этот файл, изменить вывод HTML по своему вкусу и выбрать в настройках свой новый макет вывода.
Этот же способ позволяет выполнять любой свой PHP-код в нужном месте и в нужное время.
Именно такую структуру мы видим в одном из простейших модулей Joomla — mod_custom — «HTML-код».

Хелпер (helper) модуля Joomla
Если наш модуль делает что-то более сложное, чем просто вывод значений из настроек модуля, например:
- отображает список новых статей на сайте;
- показывает карусель товаров из компонента интернет-магазина;
- выводит популярные комментарии или фотографии из фото-галереи ;
- подтягивает данные модуля по ajax (ajax-корзина товаров, к примеру).
то все функции, выполняющие эту работу, помещаются в хелпер модуля. В Joomla 3 он помещался в файл helper.php, находящийся рядом с основным php-файлом. Подключение хелпера было в «точке входа» с помощью JLoader::register(‘ModWtyandexmapitemsHelper’, __DIR__ . ‘/helper.php’);
Стало (Joomla 4)

Для создания модуля в Joomla 4 нужны следующие файлы (с меньшим количеством можно поэкспериментировать спортивного интереса ради):
Файл mod_wtyandexmapitems.xml
Этот файл содержит описание модуля для установщика расширений Joomla (системное имя, дата, версия, сайт разработчика и т.д.), параметры конфигурации, сервер обновлений, а также задаёт Namespace модуля и директории для автозагрузки классов.

MOD_WTYANDEXMAPITEMS Sergey Tolkachyov 13/09/2022 (C) 2022 Sergey Tolkachyov. GNU General Public License version 2 or later info@web-tolk.ru https://web-tolk.ru 1.0.0 MOD_WTYANDEXMAPITEMS_DESC Joomla\Module\Wtyandexmapitems src language services tmpl language/en-GB/mod_wtyandexmapitems.ini language/en-GB/mod_wtyandexmapitems.sys.ini language/ru-RU/mod_wtyandexmapitems.ini language/ru-RU/mod_wtyandexmapitems.sys.ini Также обратите внимание, что для корректной установки и работы модуля нужно указывать атрибут module=»mod_wtyandexmapitems» в xml-манифесте. Если в Joomla 3 этот атрибут указывался для файла «точки входа» (
mod_wtyandexmapitems.php ), то сейчас он указывается для папки src модуля —src .Ещё одно нововведение связано с языковыми файлами: теперь в именах файлов не обязательно дублировать префикс языка — «ru-RU.mod_wtyandexmapitems.ini». Достаточно того, что файл лежит в папке «ru-RU».
Файл services/provider.php
Файл — сервис-провайдер Вашего модуля. Он сообщает Joomla, что Ваш модуль существует и регистрирует namespace модуля в глобальном пространстве имён.
registerServiceProvider(new ModuleDispatcherFactory('\\Joomla\\Module\\Wtyandexmapitems')); // Namespace модуля для хелпера $container->registerServiceProvider(new HelperFactory('\\Joomla\\Module\\Wtyandexmapitems\\Site\\Helper')); // Namespace модуля для своих типов полей $container->registerServiceProvider(new HelperFactory('\\Joomla\\Module\\Wtyandexmapitems\\Site\\Fields')); $container->registerServiceProvider(new Module); > >;Некоторые модули для Joomla могут быть довольно сложными, использовать дополнительные PHP-библиотеки и SDK, поэтому в папке src модуля могут быть самые разные Namespace, которые можно зарегистрировать в сервис-провайдере, дабы они были доступны глобально. Однако, я предпочитаю библиотеки оформлять отдельными расширениями Joomla и устанавливать их в папку libraries в корне сайта, а обращаться к ним уже по namespace. Это удобно для тех случаев, когда не одно Ваше расширение использует данную библиотеку, а несколько. В таком случае для библиотеки потребуется системный плагин, регистрирующий её namespace в глобальном пространстве имён.
Берём на заметку, что в Namespace указывается «клиент» модуля — «Site» или «Administrator».
Файл src/Dispatcher/Dispatcher.php
Этот файл используется для того, чтобы передать данные из хелпера модуля в макет (layout).
moduleExtension = $this->app->bootModule('mod_wtyandexmapitems', 'site'); > /** * Returns the layout data. * * @return array * * @since 1.0.0 */ protected function getLayoutData() < $data = parent::getLayoutData(); // Вариант использования хелпера через Namespace $data['placemarks'] = (new WtyandexmapitemsHelper)->getPlacemarks($data['params'], $this->getApplication()); // ИЛИ // Вариант использования хелпера через $this->moduleExtension, // который мы загрузили в конструкторе класса $helper = $this->moduleExtension->getHelper('WtyandexmapitemsHelper'); // ИЛИ // Вариант использования хелпера напрямую из этого метода, // не загружая модуль в $this->moduleExtension. // Тогда строка $this->moduleExtension в __construct() не нужна. $helper = $this->app->bootModule('mod_wtyandexmapitems', 'Site')->getHelper('WtyandexmapitemsHelper'); $data['placemarks'] = $helper->getPlacemarks($data['params'], $this->getApplication()); return $data; > >Особый интерес для нас представляет функция getLayoutData() , так как именно в ней мы обращаемся к методам нашего хелпера модуля и помещаем полученные данные в массив $data . Ключ массива $data может быть любым и может быть не единственным. Можно провести параллель с Model в MVC, когда мы из разных мест собираем данные и передаём их для отображения.
В хелпере модуля можно собрать один результирующий массив данных и в диспетчере передать на рендер только его (обратившись только к одному методу хелпера — точке входа в хелпер). А можно обращаться к разным методам хелпера в диспетчере, присваивая данные разным элементам массива $data . Подход к реализации Вы выбираете сами, распределяя функционал между этими двумя файлами.
Файл src/Helper/WtyandexmapitemsHelper.php
Хелпер модуля. Имя файла = имя модуля без суффикса «mod_» + Helper (с заглавной буквы).
Namespace хелпера — Joomla\Module\Wtyandexmapitems\Site\Helper . Вместо «Site» может быть «Administrator», если у Вас модуль для панели администратора, например для дашбордов Joomla 4. Имя класса совпадает с именем файла. Внутри — нужные Вам функции.
getPlacemarks($data['params'], $this->getApplication()); */ > >В данном случае в методе getPlacemarks() я получаю с помощью нескольких методов список материалов Joomla 4, их пользовательские поля, выбираю (сообразно настройкам модуля) поле, в котором хранятся координаты, а затем собираю массив со структурой, необходимой для Яндекс карт.
Работа с Ajax в модулях Joomla 4
Если Вашему модулю есть что отдать по ajax на фронт, то для этого нужно в хелпере модуля создать метод getAjax() .В нашем случае на Яндекс.карты будет загружаться более 100 меток с текстами и картинками. Поэтому целесообразнее получать эти данные по ajax.
Согласно документации Joomla по использованию ajax Вы можете в запросе указывать конкретный метод хелпера. В таком случае имя метода должно заканчиваться на «Ajax»: например method=mySuperAwesomeMethodToTrigger вызовет метод mySuperAwesomeMethodToTriggerAjax модуля.
Пример ajax-запроса, реализованного нативными средствами Joomla (статья-мануал на Хабре).
Joomla.request(< url: window.location.origin + "/index.php?option=com_ajax&module=wtyandexmapitems&format=raw", onSuccess: function (response, xhr)< if (response !== "")< let placemarks = JSON.parse(response); console.log(placemarks); objectManager.add(placemarks); myMap' . $module->id . '.geoObjects.add(objectManager); > > >); >Файл tmpl/default.php — макет вывода в Joomla
Здесь по-прежнему находится HTML-вёрстка Вашего модуля. Его по-прежнему можно скопировать в ту же папку или в папку с Вашим шаблоном (сделать переопределение), переименовать и изменить вывод HTML, не отказывая себе в самых страшных извращениях и при этом не опасаясь того, что Ваши изменения будут затёрты при обновлении движка.
В файлах макетов вывода, как правило, находится цикл вывода данных foreach.
В Joomla 3 нередко можно было встретить следующую конструкцию:
// Файл "точка входа" модуля mod_menu.php // $list - массив с пунктами меню, которые передаются в макет вывода $list = ModMenuHelper::getList($params);// Файл tmpl/default.php - макет вывода модуля mod_menu // $list - массив с пунктами меню, которые передаются в макет вывода foreach ($list as $i => &$item)< // здесь работа по отображению HTML меню, с учетом настроек модуля и данных в массиве >В Joomla 4 в принципе осталось то же самое, за небольшими изменениями:
- данные мы получаем из хелпера и передаём не в «точке входа» (которой теперь нет по определению), а в файле src/Dispatcher/Dispatcher.php . Те самые $data[‘placemarks’] в макете вывода становятся просто $placemarks .
- «рядом» с Вашими переменными передаются следующие:
- $module — объект модуля. Оттуда Вы можете взять id модуля ( $module->id ), заголовок модуля, его позицию и т.д.
- $app — объект приложения. Это значит, что Вам не нужно самостоятельно вызывать Joomla\CMS\Factory::getApplication() . Он уже есть для Вашего удобства.
- $input — также в макете модуля теперь сразу доступен объект Input (через него мы получаем GET, POST параметры, SERVER и т.д.), который раньше приходилось вызывать самостоятельно.
- $params — параметры модуля. Получаем их как раньше: $params->get(‘param_name’ , ‘default_value_if_value_is_empty’) . Эти параметры мы собираем с помощью различных типов полей Joomla в xml-манифесте модуля.
- $template — параметры настроек стиля текущего шаблона. У шаблонов Joomla есть templateDetails.xml, в которых можно задавать различные параметры шаблона: логотипы, шрифты, пользовательские скрипты в и и всё, что душе угодно. Теперь в модуле Вы имеете возможность без лишних шевелений получить доступ к этим параметрам. Однако, стоит помнить, что многие студийные шаблоны (JoomShaper Helix и иже с ними) не используют стандартное место хранение параметров, поэтому там может оказаться пусто.
Свои типы полей Joomla для модуля
Как и в Joomla 3, в Joomla 4, если Вам не хватает стандартных типов полей, у Вас есть возможность создавать свои типы полей. Это могут быть нестандартные выборки из базы данных, получение значений списка из сторонних сервисов по API и т.д.
Возможность создавать свои пользовательские типы полей открывает широкие возможности Joomla. Наглядный пример:
Joomla 3
В Joomla 3 Вам надо было указать свой тип поля и назначить атрибут addfieldpath родительскому или напрямую . Например
Php-файл поля находится в папке с модулем modules/mod_wtyandexmapitems/fields .
Joomla 4
В Joomla 4 атрибут addfieldpath не работает. Вместо него используется атрибут addfieldprefix , в котором нужно указать namespace для пользовательских полей модуля.

Поля мы складываем в src/Fields . У файлов полей должен быть namespace namespace Joomla\Module\Wtyandexmapitems\Site\Fields . Я использую собственный тип поля, расширяющий тип поля spacer (пробел), для вывода своего логотипа, версии модуля, ссылки на сайт и иногда дополнительной информации.

А вот пример использования в Joomla 3. Плагин для двухсторонней интеграции Joomla с CRM Битрикс 24 в настройках показывает информацию об аккаунте, из-под которого создан вебхук на стороне Битрикс 24. Если информация отображается, значит плагин настроен верно.

А здесь в настройках плагина отображается список стадий лида (или сделки), получаемый по API из CRM Битрикс 24. Это так же реализовано с помощью пользовательских типов полей (пример из версии для Joomla 3).

Гибридный вариант модуля
Если у Вас совсем нет времени, а завести «со шморгалкой» старый модуль на Joomla 4 всё-таки надо, поддерживается (пока что) как старый, так и гибридный вариант структуры модуля.
- Пока что можно обойтись без сервис-провайдера. Вообще. Тогда нужен файл «точки входа» mod_wtyandexmapitems.php и соответствующая строка в xml-манифесте модуля.
- Пока что можно обойтись без папки src. И подключать хелпер по старинке через JLoader::register(‘ModWtyandexmapitemsHelper’, __DIR__ . ‘/helper.php’) . Соответственно файл helper.php должен лежать рядом с «точкой входа» в модуль.
- Можно переместить хелпер в папку src , переименовать файл, назначить ему namespace (и в xml-манифесте модуля тоже) и использовать в «точке входа» просто use Joomla\Module\Wtyandexmapitems\Site\Helper\WtyandexmapitemsHelper — namespace хелпера. На момент написания статьи большая часть даже стандартных модулей Joomla переделана именно так, с частичным сохранением старой структуры. Полностью новым канонам пока что соответствует лишь модуль панели управления mod_quickicon — иконок быстрого доступа.
Полезные дополнения
Об использовании \Joomla\CMS\Factory
Вы должны использовать ТОЛЬКО ДВА метода \Joomla\CMS\Factory в Joomla 4:
- getContainer() — возвращает контейнер внедрения зависимостей Joomla (DI Container, иногда сокращенно DIC).
- getApplication() — возвращает текущий объект приложения Joomla, обрабатывающий запрос.
Всё. Больше ничего другого использовать не нужно! Всё остальное предоставляется либо через DI-контейнер, либо через сам объект приложения.
Чтобы получить документ приложения используйте \Joomla\CMS\Factory::getApplication()->getDocument() .
Правильное подключение CSS и JS в Joomla 4
- Статья Как правильно подключать JavaScript и CSS в Joomla 4
- Статья на хабре Использование WebAssetsManager Joomla 4 и добавление собственных пресетов с помощью плагина. Мы помним, что все CSS и JS файлы должны лежать в папке media . Подробнее в статьях.
Замена для популярных, но устаревших методов
Многие из этих методов работали ещё со времен Joomla 1.5 (с 2008 года!).
- JRequest::getUri() заменяем на $uri = Joomla\CMS\Uri::getInstance() и читаем документацию к нему.
- методы JRequest::getCmd и аналогичные перекочевали в Joomla\Input\Input или (что проще) $app->getInput() . Пока что поддерживается устаревший синтаксис $app->input , но в Joomla 5 (выйдет осенью 2023 года) он может быть удалён (план выпуска релизов и принципы удаления устаревшего кода в Joomla).
- $app->isAdmin() и $app->isSite() стали $app->isClient(‘Site’) и $app->isClient(‘Administrator’) .
- Подключение к базе данных: вместо JFactory::getDbo() (или Joomla\CMS\Factory::getDbo ) используем $app->getContainer()->get(‘DatabaseDriver’) (‘DatabaseDriver’ регистрозависимый).
- Получение объекта пользователя: вместо JFactory::getUser() (или Joomla\CMS\Factory::getUser() ) используем $app->getIdentity()
Заключение
Буду рад, если статья окажется полезной для разработчиков. Также буду признателен замечаниям и исправлениям, если таковые имеются у читателей.
Полезные ресурсы
Ресурсы сообщества:
- форум русской поддержки Joomla.
- интернет-портал Joomla-сообщества.
- https://vc.ru/s/1146097-joomla — Сообщество Joomla на VC.
Telegram:
- Чат сообщества «Joomla! по-русски».
- Joomla для профессионалов, разработчики Joomla.
- Новости о Joomla! и веб-разработке по-русски.
- Вакансии и предложения работы по Joomla: фуллтайм, частичная занятость и разовые подработки. Размещение вакансий здесь.
- Англоязычный чат сообщества.
- Новости Joomla! по-английски
