Рассмотрим ряд критичных изменений, которые претерпел модуль jWeather By IP в ходе своей миграции от Joomla 3 к Joomla 4. Обе версии доступны в гитхабе автора.
Структура файлов модуля почти не изменилась, и краткий их обзор начнем с установочного файла mod_foo.xml.
В новой редакции (в отличие от старой) так:
<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"
Продолжение следует...
Комментарии в блоге