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

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

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

Однако, помогает он исключительно «на первый взгляд».

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

Например, такую:

Call to a member function getTag() on null

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

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

Итоговый код будет выглядеть так:

use Joomla\CMS\Factory;
use Joomla\CMS\Language\LanguageFactoryInterface;
use Joomla\CMS\Plugin\PluginHelper;

define('_JEXEC', 1);
define('JPATH_BASE',$_SERVER['DOCUMENT_ROOT']);

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
$container = Factory::getContainer();
$container->alias('session.web', 'session.web.site')
    ->alias('session', 'session.web.site')
    ->alias('JSession', 'session.web.site')
    ->alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
    ->alias(\Joomla\Session\Session::class, 'session.web.site')
    ->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');
$app = $container->get(\Joomla\CMS\Application\SiteApplication::class);

$app->createExtensionNamespaceMap();

$lang = $container->get(LanguageFactoryInterface::class)->createLanguage("ru-RU", false);
$app->loadLanguage($lang);

PluginHelper::importPlugin('system');

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

Заключение

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

Если у вас появилось желание написать простое человеческое спасибо, сделать это можно в моей группе VK по ссылке ниже:

https://vk.com/sitogon

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