Почитать другие заметки или статьи

Миграция на Joomla 4 заставляет часто сталкиваться с однотипными задачами. Часть из них я уже описывал на своем сайте. Над этим текстом я разместил тег «Миграция на Joomla 4», клик по которому откроет все материалы, так или иначе связанные с данной темой. Данную же заметку хотелось посвятить ошибке «Class 'JSite' not found».

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

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

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

Итак, сайт переведен в режим отладки и сообщает, что имеет место быть ошибка:

Class 'JSite' not found

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

Там расположилась следующая строчку кода:

$router = Jsite::getRouter();

Действительно, в ранних версиях Joomla был класс Jsite, который при обращении к методу getRouter возвращал ссылку на объект роутера.

В Joomla 4 данный класс был окончательно удален. И первый порыв — это найти замену классу.

Однако, я не сторонник поспешных действий и было принято решение выяснить: где и для чего далее в коде используется переменная $router.

На 135 строке обнаружился следующий код:

$link = ($router->getMode() == JROUTER_MODE_SEF) ? 'index.php?Itemid=' . $menu_id : $node->getLink() . '&Itemid=' . $menu_id;

В данном коде проверяется условие. И в зависимости от этого условия формируется переменная $link.

Дело в том, что в старых версиях Joomla класс роутера содержал метод getMode, который возвращал текущий статус. А именно: активирован или нет режим SEF в общих настройках сайта.

В Joomla 4 данный метод также был удален.

Поэтому, даже если я обходным путем получил бы объект роутера, это меня не спасло.

Постановка задачи

Настало время составить задачу и затем ее решить.

1) Написать код, который будет определять статус активации SEF и хранить его в переменной. Пусть она называется $sef_is_enabled.

2) Во фрагменте кода, где формируется переменная $link , заменить условие на новое, где будет проверяться переменная $sef_is_enabled.

Выполнение задачи

Самый простой способ для выполнения пункта 1 — это получить статус SEF из общих настроек сайта.

Строчку $router = Jsite::getRouter(); мы заменим следующим кодом.

use Joomla\CMS\Factory;
$app  = Factory::getApplication();
$sef_is_enabled = $app->get('sef', false); // Получили статус sef

Теперь осталось изменить код, где формируется переменная $link

$link = ($sef_is_enabled) ? 'index.php?Itemid=' . $menu_id : $node->getLink() . '&Itemid=' . $menu_id;

На этом, собственно, все. Задача решена!

С удовольствием выслушаю вопросы в группе «Вконтакте» по ссылке ниже:

https://vk.com/sitogon

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