Миграция на 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;
На этом, собственно, все. Задача решена!
С удовольствием выслушаю вопросы в группе «Вконтакте» по ссылке ниже:
С уважением, Владимир Егоров