Модуль с PHP для Joomla: варианты реализации и примеры
Модуль содержимого PHP в Joomla: решения для вывода динамического кода
Для вставки PHP кода в модули Joomla применяются несколько подходов. Выбор зависит от требуемой гибкости и безопасности. Ниже рассмотрены основные варианты.
Как эффективно добавить PHP код в модуль Joomla?
Основное решение использование плагина Sourcerer. Он позволяет вставлять PHP, HTML, CSS, JavaScript в любом месте через синтаксис {source}...{/source}. После установки и активации плагина код обрабатывается.
Цели: быстрая вставка небольших скриптов, отладка, вывод данных из БД, интеграция сторонних сервисов без создания отдельных модулей.
Пример шагов:
// Установка Sourcerer через менеджер расширений Joomla.
// Затем создание модуля "Произвольный HTML" и помещение в него:
{source}
echo "Привет, Joomla!";
{/source}Contents php mod (модуль содержимого php)
Результат: на странице отобразится "Привет, Joomla!".
Типичные ошибки: не активирован плагин Sourcerer, синтаксические ошибки в PHP, конфликт с кэшированием страницы. Решение: проверить статус плагина, использовать отладку Joomla, отключить кэш для тестирования.
Какой альтернативный плагин для PHP модуля используется?
Плагин DirectPHP работает по схожему принципу, использует тег {php}...{/php}. Установка и настройка аналогичны Sourcerer.
Цели: альтернатива Sourcerer, если требуется другой синтаксис или плагин не устанавливается.
{php}
$user = JFactory::getUser();
echo "Здравствуйте, " . $user->name;
{/php}
Результат: имя текущего пользователя.
Проблема: при использовании JFactory::getUser() в некоторых версиях Joomla нужно подключать библиотеки. Решение: использовать use Joomla\CMS\Factory и вызывать Factory::getUser().
Как создать собственный модуль Joomla для вывода PHP?
Создание кастомного модуля требует написания файла mod_myphp.php и манифеста. Это дает полный контроль над логикой.
Цели: когда нужен полноценный модуль с настройками и повторным использованием на разных страницах, сложная логика.
Пример структуры:
// mod_myphp.php
defined('_JEXEC') or die;
$document = JFactory::getDocument();
$document->addScriptDeclaration('alert("PHP работает!");');
require JModuleHelper::getLayoutPath('mod_myphp');
В манифесте указываются параметры. Модуль отображается в менеджере модулей.
Ошибка: отсутствие проверки direct access (_JEXEC) может привести к уязвимости. Решение: всегда включать defined('_JEXEC') or die.
Как использовать системный плагин для обработки PHP в модулях?
Некоторые системные плагины (например, "Content - PHP") позволяют выполнять PHP в статьях. Для модулей нужно включить опцию "Подготовка содержимого" и использовать плагин "System - PHP".
Цели: если не хочется устанавливать сторонние расширения, но есть встроенная поддержка.
// В модуле "Произвольный HTML" включить "Подготовка содержимого" и написать:
[php] echo date('Y-m-d'); [/php]
Результат: текущая дата.
Проблема: плагин может быть устаревшим или отсутствовать. Решение: установить актуальную версию или использовать Sourcerer.
Расширенные примеры использования PHP в модулях Joomla
Вывод последних новостей из категории
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Helper\ModuleHelper;
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName(array('id', 'title', 'introtext')))
->from($db->quoteName('#__content'))
->where($db->quoteName('catid') . ' = 5')
->order($db->quoteName('created') . ' DESC')
->setLimit(5);
$db->setQuery($query);
$articles = $db->loadObjectList();
echo '<ul>';
foreach ($articles as $article) {
echo '<li><a href="' . JRoute::_('index.php?option=com_content&view=article&id=' . $article->id) . '">' . htmlspecialchars($article->title) . '</a></li>';
}
echo '</ul>';
<ul> <li><a href="/joomla/article/1">Новость 1</a></li> <li><a href="/joomla/article/2">Новость 2</a></li> <li><a href="/joomla/article/3">Новость 3</a></li> <li><a href="/joomla/article/4">Новость 4</a></li> <li><a href="/joomla/article/5">Новость 5</a></li> </ul>
Использование JModel для получения статей
// Загрузка модели статей
JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_content/models');
$model = JModelLegacy::getInstance('Articles', 'ContentModel');
$model->setState('list.start', 0);
$model->setState('list.limit', 10);
$model->setState('filter.category_id', 10);
$items = $model->getItems();
foreach ($items as $item) {
echo $item->title . '<br>';
}
Статья 1<br> Статья 2<br> Статья 3<br> ...
Отправка email через модуль
$mailer = JFactory::getMailer();
$config = JFactory::getConfig();
$sender = array($config->get('mailfrom'), $config->get('fromname'));
$mailer->setSender($sender);
$recipient = 'user@example.com';
$mailer->addRecipient($recipient);
$mailer->setSubject('Тест');
$mailer->setBody('Тестовое письмо из модуля');
if ($mailer->send()) {
echo 'Письмо отправлено';
} else {
echo 'Ошибка отправки';
}
Письмо отправлено
Использование параметров модуля
$limit = $params->get('limit', 5);
$categoryId = $params->get('category', 0);
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select('id, title')
->from('#__content')
->where('catid = ' . (int)$categoryId)
->setLimit($limit);
$db->setQuery($query);
$rows = $db->loadObjectList();
echo '<ul>';
foreach ($rows as $row) {
echo '<li>' . htmlspecialchars($row->title) . '</li>';
}
echo '</ul>';
<ul> <li>Статья 1</li> <li>Статья 2</li> ... </ul>
Обработка POST данных
$input = JFactory::getApplication()->input;
$name = $input->get('username', '', 'STRING');
if ($name) {
echo 'Привет, ' . htmlspecialchars($name);
} else {
echo 'Введите имя';
}
// Форма: <form method="post"><input type="text" name="username" /><input type="submit" /></form>
(при отправке формы с именем Peter) Привет, Peter