День X настал и в административной панели Joomla появилось сообщение о том, что поддержка Joomla 3 прекращается. Есть тысяча причин задуматься о переходе на новую версию. И имя ей — Joomla 4. К моменту написания этих строчек я уже перенес несколько сайтов и хочу поделиться своими мыслями о том, как происходила данная операция, какие подводные камни ждут на пути обновления движка вашего сайта.

Если к моменту перехода на Joomla 4 вы исправно обновляли движок своего сайта, который по научному называется системой управления контентом (CMS), то база данных вашего сайта находится в необходимом для обновления состояния. И это хорошая новость.

Ибо знал я те времена, когда при переходе с одной версии на другую для переноса данных приходилось использовать сторонние компоненты.

На этом хорошие новости заканчиваются.

Все последующие препятствия, загадки и всевозможные квесты будут связаны со скриптами. И это неудивительно. В Joomla 4 серьезно переработано сердце системы, удалены либо переименованы некоторые классы и методы.

Поэтому при попытке открыть компонент, модуль или плагин разработанный под старые версии Joomla вас будет приветствовать сообщение об ошибке.

Мой вердикт таков: если вы не обладаете навыками программирования на PHP, шансы успешно обновить Joomla стремятся к нулю. Ибо весь процесс переноса — это адаптация уже установленных расширений к новой версии.

А теперь минутка рекламы.

Если вы не готовы самостоятельно осуществить процесс миграции c Joomla 3 на Joomla 4 — пишите и звоните. Мой телефон (он же телеграмм и WhatsUP) указан на сайте. Я оказываю данную услугу.

В моем понимании миграция сайта — это:

1) Сохранение дизайна «старой версии» сайта

2) Сохранение функциональности сайта

3) Отсутствие ошибок после обновления сайта, как на его страницах, так и в консоли браузера

Для посетителя сайта процесс обновления должен пройти незаметно, однако администратор получает новую версию Joomla и в качестве приза - возможность регулярного обновления этой системы.

Начало обновления Joomla

В начале непростого пути под названием «Обновление Joomla» хочу сделать объявление!

Если вы планируете производить миграцию на рабочем сайте, немедленно откажитесь от этой идеи!

Для обновления сайта необходимо создать полную копию сайта: и файлы и база данных никак не должны пересекаться с его рабочим вариантом.

Пока мы производим миграцию на тестовом, оригинальный сайт продолжает работать. После завершения миграции мы просто заменяем один сайт другим!

Итак, мы в административной панели нашего подопытного сайта. Который работает под управлением Joomla 3.

Перед началом обновления, обязательно нужно отключить все сторонние плагины и модули. То есть те плагины и модули, которые не входили в стандартную сборку Joomla.

Особенно внимание нужно уделить системным плагинам и модулям административной панели. Ибо с большой вероятностью они приведут к 500 ошибке на этапе завершения обновления системы и административная панель Joomla будет недоступна.

Операцию по обновлению Joomla мы начинаем в одноименном компоненте.

При открытии страницы компонента «Обновление Joomla» есть большая вероятность того, что вы увидите сообщение о том, что обновления отсутствуют.

Не верьте не единому слову!

Для устранения этого недоразумения в правом верхнем углу нажмем кнопку «Настройки»

Далее в качестве сервера обновлений выбираем «Joomla Next»

Сохраняем настройки и возвращаемся на страницу компонента обновления. Откроется страница, где будет показана актуальная версия для обновления.

Также будет произведен анализ вашей системы и красным цветом подсвечены плагины, которые требуется отключить.

На самом деле… а я писал об этом выше… мы должны выключить все плагины, которые не входят в стандартную сборку Joomla, поэтому подсвеченных красным цветом расширений у нас не будет. А если они вдруг, каким то магическим способом, обнаружились, немедленно отправляемся их отключать.

Заключительный шаг — переход на вкладку «Автоматическое обновление» и нажатие на кнопку «Установить»

Упс… ошибка 500

Достаточно распространенная ситуация, когда обновление завершается страницей с ошибкой. Я не поленился и выложил скриншот такой страницы.

Зачем?

Потому что она красивая.

А еще она не несет никакой информации. И с этим нужно что-то делать.

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

При любой ошибке на сайте, задача номер один — найти скрипт приводящий к ошибке, задача номер два — устранить ошибку.

Для решения первой задачи нам понадобится включить режим отладки. Обычно это делается из административной панели, однако она у нас недоступна.

Поэтому в корневой директории нашего сайта находим файл configuration.php. Для этого понадобится FTP менеджер с возможностью редактирования.

Открываем файл в текстовом редакторе и находим строку:

public $debug = '0';

...меняем значение на 1, чтобы получилось:

public $debug = '1';

Сохраняем файл configuration.php, возвращаемся в административную панель и обновляем страницу с ошибкой.

На этот раз она будет не настолько красочной, как ранее, зато гораздо информативнее. Пример такой страницы привожу ниже, где стрелочками пометил места, которые представляют ценность и важность.

Если вам удалось решить проблему с ошибкой и административная панель стала доступна для полноценной работы (а может, и вовсе не было никакой ошибки), следует провести ревизию установленных сторонних расширений: компонентов, модулей, плагинов и поискать их версии для Joomla 4 на сайтах разработчиков.

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

Проблемы могут создавать не только сторонние расширения, но и те, что идут в стандартной поставке Joomla.

А именно переопределения макетов шаблона, который работал под Joomla 3 и который мы должны переделать под Joomla 4.

Пару слов о том, как переделать шаблон под Joomla 4

Условно шаблоны для Joomla можно поделить на две категории:

1) Те, что созданы на основе фреймворков — дополнительных плагинов, компонентов

2) Те, что созданы без фреймворков

В первом случае нужно немедленно идти на сайт разработчика фреймворка и искать версию для Joomla 4.

Если таковой нет, то придется либо переписывать фреймворк самому, что очень трудозатратно. Либо искать другой шаблон.

К слову, я всегда был противником варианта номер один.

С шаблонами созданными стандартными средствами Joomla — проще. Однако, есть нюансы.

В Joomla 4 не отображаются заголовки у модулей

Одним из таких нюансов может быть исчезновение заголовков у модулей после обновления сайта и перехода на Joomla 4.

Как решить эту проблему?

Предлагаю открыть файл index.php нашего шаблона и изучить фрагмент кода, который выводит любой из модулей.

В моем случае код отвечающий за вывод модуля в позиции «HEADER-A» выглядит так:

<jdoc:include type="modules" name="header-a" style="vmBasic"/>

Обратите внимание на аттрибут STYLE.

Его значение: vmBasic.

Данный параметр говорит системе: отобрази данный модуль с помощью макета «vmBasic».

И если система не находит такой макет, то выводит модуль с помощью макета по умолчания, где заголовок не отображается.

В Joomla 3 макеты определялись в файле, расположенном в каталоге:

/templates/ваш_шаблон/html/modules.php

Где каждому макету соответствовала отдельная функция.

В Jooomla 4 за определение стиля модуля отвечает отдельный файл. Располагаться он должен в каталоге:

templates/ваш_шаблон/html/layouts/chromes/имя стиля.php

Как устроен файл стиля модуля можно посмотреть в предустановленном шаблоне «Cassiopeia», который поставляется с Joomla 4.

Ошибки после обновления

behavior::modal not found или behavior::formvalidation not found.

Достаточно частая ошибка, которая вызывается устаревшими макетами модулей и компонентов. Для ее устранения нужно при включенном режиме отладки выяснить: какой файл ее вызывал, далее найти в файле инструкцию:

JHTML::_ ('behavior.modal');

или

JHtml::_('behavior.formvalidation');

И стереть ее.

Последнюю неплохо заменить на следующую конструкцию:

use Joomla\CMS\HTML\HTMLHelper; 
use Joomla\CMS\Factory;

$app = Factory::getApplication(); 
$document = $app->getDocument();

$wa = $document->getWebAssetManager();
$wa->useScript('keepalive') ->useScript('form.validate');
HTMLHelper::_('bootstrap.tooltip');

Она необходима для корректной работы форм, а именно проверки полей на корректность заполнения

К слову, необходимо везде отказываться от класса Jhtml и заменять его классом HTMLHelper. Не забывая его импортировать в начале файла.

Cannot access protected property Joomla\CMS\Menu\MenuItem::$params

Ошибка возникает при обращении к свойству PARAMS, которое в Joomla 4 имеет уровень доступа «protected», что запрещает прямое к нему обращение.

Там, где появляется подобная ошибка команду

$ваша переменная->params->get

Нужно заменить на:

$ваша переменная->getParams()->get

Class 'JRequest' not found

От класса Jrequest по хорошему нужно было отказываться еще в Joomla 3. поскольку он в даже в третьей версии считался устаревшим.

В Joomla 4 волевым усилием разработчики вообще его исключили.

Если вы видите в коде нечто вроде:

Jrequest::getVar('какая то переменная’)

То перед вызовом метода необходимо получить объект input, в котором хранятся все переменные запросов:

use Joomla\CMS\Factory;
$app = Factory::getApplication();
$input = $app->input; 

Далее там, где было

Jrequest::какой то метод(какая то переменная)

мы меняем на :

$input->get('какая то переменная’)

На тему работы с переменными запроса есть хорошая статья. Она написана до выхода Joomla 4, но до сих пор актуальна.

Нюанс лишь в том, что класс JFactory в Joomla 4 заменен на Factory

Class 'JApplication' not found

Класс JApplication также был удален, однако наша задача не заменить этот класс целиком, а понять - к каким методам обращался "старый" код из этого класса.

И делаем мы это также из режима отладки.

Как видим, ошибка в файле /administrator/components/com_k2/models/item.php, на 931 строке.

И если мы откроем этот фрагмент кода, то увидим обращение к методу getHash

Выглядит это так:

JApplication::getHash 

Данный метод получает хеш, попросту кодирует определенные данные. В Joomla 4 его можно заменить следущей конструкцией:

use Joomla\CMS\Application\ApplicationHelper;
ApplicationHelper::getHash($Ваша_переменная);

При миграции компонентов с Joomla 3 на Joomla 4 ошибку связанную с классом  JApplication можно встретить и в административной панели.

В частности, в Joomla 3 существовал метод JApplication::stringURLSafe, который использовался при создании алиасов материалов.

В Joomla 4 заменой этому методу станет: ApplicationHelper::stringURLSafe

Заключение

Пишу эти строчки 15 августа 2022 года. Уверен, данный материал будет неоднократно обновляться. Хочется сказать лишь одно: универсального рецепта по переносу сайта с Joomla 3 на Joomla 4 нет. При этом нужно понимать, что портировать на новую версию можно и нужно любой сайт. Независимо от установленных на нем расширений и предыдущих их доработок.

С уважением, Владимир Егоров