Подготовка расширения к переходу на 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');
.
JHtml::_('behavior.tooltip');
меняется на HTMLHelper::_('bootstrap.tooltip');
.
Но предпочтение стоит отдавать новому менеджеру ассетов (существует только в Joomla 4):
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('form.validate')
JObject.
Класс JObject исключен. Вместо этого используйте \stdClass или \Joomla\Registry\Registry.
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.
В публичной части больше нет привязки к конкретному фреймворку.