Как написать расширение типа "модуль" для Joomla 3.x
CMS Joomla! 3.x построена с использованием трех разных приложений:
installation (используется для установки Joomla)
administrator (используется для управления контентом)
public (используется для отображения содержимого).
Программа installation используется один раз. Программы administrator и public через концепцию компонентов с модулями. Каждый модуль имеет одну точку входа, расположенную в папке modules. Модули именуются как:
mod_ИМЯ_МОДУЛЯ / ИМЯ_МОДУЛЯ.php
Разработку модуля можно разделить на несколько этапов:
- создать файловую структуру модуля
- внести в неё рабочие файлы<</li>
- заархивировать в ZIP
- установить в Joomla
Простой модуль
Далее - создаём простой модуль с именем webstart, который выводит на экран строку: "Ученье - свет!"
Файловая структура модуля
Первое, что нужно сделать - создать стандартную
Существует четыре основных файла, которые используются в стандартном шаблоне для разработки модуля:
- mod_webstart.php - файл, который является основной точкой входа для модуля, он выполнит амнеобходимые процедуры инициализации, вызовет программу - helper для сбора любых необходимых данных и подключит шаблон, который будет отображать вывод модуля
- mod_webstart.xml - файл, который содержит информацию о модуле, он определяет файлы, которые необходимо установить с помощью установщика Joomla, задает параметры конфигурации модуля
- helper.php - файл, который содержит класс helper, который используется для фактической работы модуля, для чтения информации из баз данных
- tmpl / default.php - это шаблон модуля - файл который принимает данные, собранные mod_webstart.php, и генерирует HTML-код для вывода в окно браузера
- index.html - из соображений безопасности во все папки стоит вставлять такой пустой файл-заглушку
Создаём файловую структуру
Создаём на диске папку webstart и в ней - необходимые файлы.
Вносим в них конфигурацию нашего модуля.
Файл mod_webstart.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1.0" client="site" method="upgrade">
<name>Web start module</name>
<author>WebStart.top project</author>
<version>1.0.0</version>
<description>My first test module.</description>
<files>
<filename>mod_webstart.xml</filename>
<filename module="mod_webstart">mod_webstart.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
</files>
<config>
</config>
</extension>
Файл mod_webstart.php
Этот файл выполнит три задачи:
- включит файл helper.php, который содержит класс, который будет использоваться для сбора необходимых данных
- вызовет соответствующий метод класса для получения данных
- подключит шаблон для вывода.
Класс - helper определяется в файле helper.php. Этот файл включен в инструкцию require_once:
<?php
// Check Joomla framework
defined('_JEXEC') or die;
// Include helper
require_once dirname(__FILE__) . '/helper.php';
$hello = modWebStartHelper::sayWodr($params);
require JModuleHelper::getLayoutPath('mod_webstart');
В строке
$hello = modWebStartHelper::sayWodr($params);
modWebStartHelper - имя класса, которое задано в файле helper.php
modWebStartHelper::getHello($params) - вызов единственного метода (функции) этого класса - sayWodr()
Директива
JModuleHelper::getLayoutPath('mod_webstart');
подключает шаблон.
Файл helper.php
<?php
class modWebStartHelper
{
public static function sayWord($params)
{
return 'Ученье - свет!';
}
}
Файл index.html
<!DOCTYPE html>
<HTML>
<HEAD></HEAD>
<BODY>
No access!
</BODY>
</HTML>
Сохраняем созданный шаблон в файле webstart.zip
Устанавливаем расширение в Joomla
Переходим в управление модулями
Публикуем его
Видим результат
Подключение к базе данных
Часто возникает необходимость при установке модуля создать и использовать свою базу данных.
Создадим новый модуль - mod_webstart_db
Для этого необходимо:
в xml - файле описания модуля (mod_webstart_db.xml) добавить теги, которые описывают SQL - запросы, которые будут выполняться при установке модуля (тег install), удалении модуля (тег uninstall), обновлении модуля (тег update). И таг <folder>sql</folder>
Файл mod_webstart_db.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1.0" client="site" method="upgrade">
<name>Web start team</name>
<author>WebStart.top project</author>
<authorEmail>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.</authorEmail>
<authorUrl>http://WebStart.top</authorUrl>
<version>1.0.0</version>
<description>Test module with database</description>
<creationDate>January 2018</creationDate>
<files>
<filename>mod_webstart_db.xml</filename>
<filename module="mod_webstart_db">mod_webstart_db.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
<folder>MySQL</folder>
</files>
<install>
<sql>
<file driver="mysql" charset="utf8">MySQL/install.mysql.1.0.0.utf8.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8">MySQL/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update>
<schemas>
<schemapath type="mysql">MySQL/updates</schemapath>
</schemas>
</update>
<config>
</config>
</extension>
Добавляем к проекту папку sql
В ней создаём файлы с именами
install.mysql.utf8.sql
uninstall.mysql.utf8.sql
и папку
updates
Файл install.mysql.utf8.sql (в папке MySQL)
CREATE TABLE IF NOT EXISTS #__web_st_db (
id int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
myMsg text NOT NULL,
lang varchar(5) NOT NULL );
INSERT INTO #__web_st_db (myMsg, lang) VALUES ('Be sure to visit the web-start.top website!', 'en-GB');
INSERT INTO #__web_st_db (myMsg, lang) VALUES ('הקפד לבקר באתר web-start.top!', 'he-IL');
INSERT INTO #__web_st_db (myMsg, lang) VALUES ('Обязательно посетите WEB-сайт web-start.top!', 'ru-RU');
Файл uninstall.mysql.utf8.sql (в папке MySQL)
DROP TABLE IF EXISTS #__web_st_db;
Файл (в папке MySQL\updates)
# Placeholder file for database changes for version 1.0.0
Файл default.php
<?php
defined('_JEXEC') or die;
echo $hello;
Файл helper.php
<?php
class modWebStartDbHelper
{
public static function sayWord($params)
{
// Obtain a database connection
$db = JFactory::getDbo();
$lang = JFactory::getLanguage();
// Retrieve the message
$query = $db->getQuery(true) -> select($db->quoteName('myMsg'))->from($db->quoteName('#__web_st_db'))->where('lang = ' . $db->Quote($lang->getTag()));
// Prepare the query
$db->setQuery($query);
// Load the row.
$result = $db->loadResult();
// Return the message
return $result;
}
}
Файл mod_webstat_db.php
<?php
// Check Joomla framework
defined('_JEXEC') or die;
// Include helper
require_once dirname(__FILE__) . '/helper.php';
$hello = modWebStartDbHelper::sayWord($params);
require JModuleHelper::getLayoutPath('mod_webstart_db');
Устанавливаем модуль в адинистративной панели Joomla, ставим его в позицию, например 7
Наш модуль использует свою таблицу в базе данных Joomla, называется она: #__web_st_db , префикс #__ заменяется на префикс всех таблиц в БД Joomla.
Мы также используем информацию о текущем языке, выбранном на сайте. Её мы получаем из Joomla framework:
$lang = JFactory::getLanguage();
$lang->getTag()
Получив префикс языка, мы используем его при выборки нужного сообщения из нашей таблицы в базе данных.
$db->Quote($lang->getTag())
Поэтому при переходе сайта на другой язык наш модуль автоматически получает другое сообщение