Понедельник, 28 марта 2022 05:02

Пишем модуль Joomla 4

Оцените материал
(4 голосов)

Материал является продолжением статей "Пишем модуль Joomla" и "Joomla 4: классы JText и Text". Ссылки в левом сайдбаре.

 

Пишем модуль Joomla 4
Пишем модуль Joomla 4

 

Рассмотрим ряд критичных изменений, которые претерпел модуль jWeather By IP в ходе своей миграции от Joomla 3 к Joomla 4. Обе версии доступны в гитхабе автора.

 

Увидеть на гитхабе.

 

Структура файлов модуля почти не изменилась, и краткий их обзор начнем с установочного файла mod_foo.xml.

 

Dev banner 1

 

В новой редакции (в отличие от старой) так:

 

<extension type="module" version="4.0" client="site" method="upgrade">

 

, не забываем указать пространство имен:

 

<namespace>FooNamespace\Module\Foo</namespace>

 

Здесь же, для advanced опций:

 

<fieldset name="advanced">
       <field name="layout" type="modulelayout" label="JFIELD_ALT_LAYOUT_LABEL" class="custom-select" />
       <field name="moduleclass_sfx" type="textarea" label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL" rows="3" />
       <field name="cache" type="list" label="COM_MODULES_FIELD_CACHING_LABEL" default="0">
            <option value="1">JGLOBAL_USE_GLOBAL</option>
            <option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
        </field>
        <field name="cache_time" type="number" label="COM_MODULES_FIELD_CACHE_TIME_LABEL" default="0" />
         <field name="cachemode" type="hidden" default="itemid">
               <option value="itemid" />
         </field>
</fieldset>

 

В остальном практически без изменений. Отмечу лишь, что в ходе тестирования модуля JED Checker v.2.4.1 ругался у меня на showon (showon позволяет в качестве условия отображения поля указать значение другого поля), тем не менее, этот атрибут работает.

Точка входа модуля mod_foo.php выполняет следующие задачи: импорт класса ModuleHelper и вспомогательного класса модуля в текущую область, также включает шаблон для отображения вывода:

 

use Joomla\CMS\Helper\ModuleHelper;
use FooNamespace\Module\Foo\Site\Helper\FooHelper;
require ModuleHelper::getLayoutPath('mod_foo', $params->get('layout', 'default'));

 

В хелпере подключаем столько классов, сколько продиктовано функциональностью модуля. Например, у меня вот так:

 

use Joomla\CMS\Factory;
use Joomla\CMS\Date\Date;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

 

Посредством Factory достаем тэг языка сайта:

 

public static function getLang()
    {
      $lang = Factory::getLanguage()->getTag();
      return substr($lang, 0, 2);
    }

 

, он понадобится в дальнейшем, например, при включении отображения Google Map в шаблоне модуля (который практически не претерпел изменений):

 

<script async defer
   src="https://maps.googleapis.com/maps/api/js?key=<?php echo $api_googlemap; ?>&callback=initMap&language=<?php echo $lang; ?>"></script>

 

Классам JText и Text, при помощи которых в Joomla реализован перевод статичных текстов - посвящена, как уже было сказано выше, целая статья в этом блоге, позвольте пожелать вам приятного чтения. В Joomla 4 возможно использование любого из них, как legacy, так и нового Text, на данный момент это непринципиально. Остановлюсь напоследок на двух других классах, HTMLHelper и Date, благо случай подходящий.

Понадобилось (уже не впервые попросил читатель сайта в комментах, не хотелось отказывать), получив из JSON timestamp (Unix-время, Unix time):

 

$sunrise = $obj['sys']['sunrise'];

 

- конвертировать затем в удобочитаемый формат, что оказалось удобно реализовать следующим образом:

 

HtmlHelper::date(new Date($sunrise), Text::_('DATE_FORMAT_FILTER_DATETIME'));

 

В чем удобство? - в том, что ряд форматов даты предопределен в Joomla как часть базовых языковых пакетов, что означает легкость интернационализации (см. How to use JDate). Класс HtmlHelper поможет вывести дату в соответствии с настройками часового пояса сайта либо пользователя (полученный мной timestamp изначально, разумеется, в UTC). Рационально, таким образом, использовать при выводе дат строки форматирования:

 

DATE_FORMAT_LC="l, d F Y"
DATE_FORMAT_LC1="l, d F Y"
DATE_FORMAT_LC2="l, d F Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="Y-m-d"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="Y-m-d H:i:s"
DATE_FORMAT_JS1="y-m-d"
DATE_FORMAT_CALENDAR_DATE="%Y-%m-%d"
DATE_FORMAT_CALENDAR_DATETIME="%Y-%m-%d %H:%M:%S"
DATE_FORMAT_FILTER_DATE="Y-m-d"
DATE_FORMAT_FILTER_DATETIME="Y-m-d H:i:s"

 

Продолжение следует...

Последнее изменениеСреда, 25 января 2023 03:37

Оставить комментарий

Добавьте ваш комментарий

Разработка web-проектов

Комментарии в блоге