Модуль с PHP для Joomla: варианты реализации и примеры

Раздел: Администрирование CMS -> Управление 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

Модуль содержимого PHP - comments

En
Contents php mod (php)