Подготовка расширения к переходу на Joomla 4

  • Дмитрий Рекун

Всегда неприятно, когда ломают обратную совместимость. Но это неизбежный виток развития любого программного обеспечения. Joomla 4 не исключение. Нам обещают обновление в один клик с Joomla 3 до Joomla 4, но всегда нужно помнить - это касается только самого ядра и расширений ядра.

Разработчики сторонних расширений Joomla сами должны позаботиться о том, чтобы их расширения продолжали успешно работать на Joomla 4. Полный список изменений доступен в официальном документе, описывающем потенциальную потерю обратной совместимости при переходе на Joomla 4.

Ниже мы приводим изменения, которые необходимо внести в расширение Joomla, чтобы обеспечить совместимость с Joomla 4. Мы рассматриваем наиболее часто встречаемые проблемы при переходе. Список будет по мере возможности дополняться новыми примерами из практики. Если у вас какой-то конкретный пример решения проблемы при переходе на Joomla 4, то пишите в комментариях, и мы с удовольствием добавим его в список.

JError и JException

Классы JError и JException были удалены. Используйте нативный Exception в случае возникновения ошибки и приложение для показа предупреждений. Совместимо с Joomla 3. Например:

try
{
	$model = $this->getModel();

	$this->state         = $model->getState();
	$this->items         = $model->getItems();
	$this->pagination    = $model->getPagination();

	parent::display($tpl);
}
catch (Exception $e)
{
	Factory::getApplication()->enqueueMessage(
		Text::_('COM_EXAMPLE_ERROR_OCCURRED'),
		'error'
	);
}

JEventDispatcher

Класс JEventDispatcher был удалён. Вызов плагинов необходимо делать через приложение. Совместимо с Joomla 3.

PluginHelper::importPlugin('myplugingroup');

Factory::getApplication()->triggerEvent();

JFactory::getXml

Удалён метод JFactory::getXml и класс JXMLElement. Вместо него используйте нативный SimpleXMLElement. Совместимо с Joomla 3.

JHtml

Вызовы типа JHtml::_('behavior.formvalidation'); могут не работать и приводить к ошибке. В каких-то случаях вместо JHtml можно использовать класс HTMLHelper (совместимо с Joomla 3), например HTMLHelper::_('behavior.formvalidator');.

Но предпочтение стоит отдавать новому менеджеру ассетов (существует только в Joomla 4):

/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $this->document->getWebAssetManager();
$wa->useScript('form.validate')

JRequest

Класс JRequest был удалён, что будет приводить к ошибке:

Class 'JRequest' not found

Вместо него используйте класс Input. Совместимо с Joomla 3. Пример использования:

$input = Factory::getApplication()->input;

$id     = $input->getInt('id');
$option = $input->getWord('option');

В контроллере компонента можно напрямую обращаться к Input через $this->input.

isAdmin() и isSite()

Удалены методы isAdmin() и isSite(), что может приводить к ошибке:

Call to undefined method Joomla\CMS\Application\AdministratorApplication::isAdmin()

Используйте Factory::getApplication()->isClient('administrator') и Factory::getApplication()->isClient('site') соответственно. Совместимо с Joomla 3.

Mootools

Javascript фреймворк Mootools был полность удалён из Joomla 4. Это может приводить к ошибкам такого вида:

Uncaught TypeError: document.id is not a function
    at Object.Joomla.submitbutton

Решение тут только одно - использовать нативный Javascript. На примере ошибки выше - заменить document.id на document.getElementById.

Переход на Bootstrap 5

В административной части Bootstrap 2 был заменён на Bootstrap 5. Используйте конвертеры для миграции разметки. Правда админку расширения всё равно придётся переверстать с учётом новой панели управления Joomla 4. Не забудьте почитать про Использование Bootstrap в Joomla 4.

В публичной части больше нет привязки к конкретному фреймворку.


© Joomla для профессионалов. Все права защищены.