Подключение сторонних PHP библиотек в Joomla

PHP библиотеки удобны тем, что к ним можно обращаться из любого места Приложения: из плагина, модели компонента, модуля и т.д. В случае, если подобную задачу кто-то уже решал и оформил в виде библиотеки (и даже обновляет её) — имеет смысл подключить в свою Joomla эту библиотеку. Например, вам для разработки способа оплаты интернет-магазина нужна официальная библиотека платёжного агрегатора. Или вас устраивает официальный PHP SDK какой-нибудь CRM.

Composer

Joomla не поддерживает работу с Composer напрямую. Для того, чтобы использовать библиотеку в своей работе её нужно «обернуть» в расширение Joomla типа library и установить. В серьёзных проектах принят подход фиксации версий всех составляющих проекта: код проверен не один раз, протестирован и допущен до работы в проде.

Вы создаете пакет с вашей библиотекой, устанавливаете везде, где нужно. По мере выхода новых версий библиотеки — вы обновляете свою обёртку и получаете все преимущества работы с расширениями Joomla: обновление расширений стандартным способом, в том числе через CLI. Просмотр Changelog расширения в админке ДО обновления и т.д.

Просмотр Changelog расширения в админке ДО обновления в Joomla 5.

Просмотр Changelog расширения в админке ДО обновления в Joomla 5.

Joomla, PCR, Symfony

Joomla соответствует стандартам PCR, поэтому в этом плане с ней удобно работать. В ядро Joomla включены некоторые пакеты Symfony (console, string, var-dumper, yaml, error-handler и другие), поэтому, если вдруг вы захотите добавить ещё — они встанут как влитые и будут хорошо работать. Посмотреть что ещё стоит в Joomla кроме компонентов Symfony можно в libraries/vendor.

Как обернуть PHP библиотеку в расширение Joomla?

Ничего сложного. Файлы библиотеки как правило находятся в папке src. Рядом с этой папкой нужно создать XML-манифест расширения Joomla согласно документации (manual.joomla.org). Затем пакуем всё в zip-архив и готово! Можно устанавливать.

Если для работы библиотеки нужны свои таблицы в базе данных — при установке или обновлении нужно добавить нужные файлы c SQL-запросами. Поскольку Joomla 4+ работает с namespaces, важно указать для расширения этот namespace в XML-манифесте. Приведу сокращенный пример XML-манифеста для библиотеки Joomla.



     WebTolk AmoCRM library
     Webtolk/Amocrm
     1.2.1
     ...
     Webtolk\Amocrm
     
          src
          amocrm.xml
     

Тег означает, что папка src из нашего архива будет скопирована в JPATH_SITE/libraries/Webtolk/Amocrm. В секции мы указываем что из архива туда нужно положить. А Webtolk\Amocrm говорит, что для папки src в JPATH_SITE/libraries/Webtolk/Amocrm необходимо зарегистрировать namespace Webtolk\Amocrm.

Важные моменты!

  • До Joomla 4.2.7 по сути тег из XML манифеста не работал. Поэтому нужно было в комплект библиотеки добавлять системный плагин, который бы регистрировал неймспейс на событии (Event Dispatcher) onAfterInitialise c помощью JLoader. Соответственно, собирать нужно было пакет из библиотеки и плагина. Начиная с Joomla 4.2.7 его починили и можно обходиться без плагина.

  • Пока что обновление библиотеки = переустановке. То есть расширение удаляется и устанавливается. Такое решение было принято где-то в недрах версий Joomla 3.x. Почему? — скрыто под горами PR. Нужно искать. Почему это важно? Потому что при установке любого расширения создается запись в «реестре» расширений — в базе данных в таблице #__extensions. В этой таблице есть 2 столбца типа TEXT — params и custom_data. А это, согласитесь, немалый объём данных. Если вы храните какие-то параметры библиотеки в базе данных с помощью Joomla\CMS\Helper\LibraryHelper, то нужно учитывать это поведение инсталлера и при обновлении библиотеки предварительно сохранять, а потом добавлять обратно сохранённые параметры в installer script расширения.

app->getConfig();
        $options    = array(
            'defaultgroup' => 'wt_amo_crm_temp',
            'caching'      => true,
            'cachebase'    => $jconfig->get('cache_path'),
            'storage'      => $jconfig->get('cache_handler'),
        );
        $cache      = Cache::getInstance('', $options);
        $cache->store($lib_params, 'wt_amo_crm_temp');

    }

    return true;

}

А в методе postflight() соответственно помещаем спасённые параметры обратно с помощью LibraryHelper::saveParams('Webtolk/Amocrm', $lib_params);.

  • Чтобы библиотека работала — она должна быть включена в менеджере расширений (Меню — Система — Управление — Расширения).

  • Нередко для работы библиотеки нужны некие параметры (API ключи, токены и прочее), что должно указываться людьми в админке Joomla. Для этих целей удобно писать плагин (своего интерфейса для настройки параметров расширение типа library не имеет). Либо системный, либо своей кастомной группы — не важно. Внутри своей библиотеки получать параметры плагина довольно быстро можно так:

params);
      $param = $params->param;
      // ИЛИ можно использовать Joomla\Registry\Registry
      $params = new Registry($plugin->params);
      $param = $params->get('param', 'defatul value if empty');
   }

В заключение хочу поделиться мнением участника Joomla-сообщества, разработчика — @kernUSR, которое он высказал в Joomla чате:

d9ac984825138831ef7e63cd238fa759.png

В Joomla как в ВДВ — «Нет задач невыполнимых».

63dafc9e50b25df00a882301c34ecf49.png
d439e90442e9c1800f4239e786bb0d38.png

Полезные ресурсы

Ресурсы сообщества:

Telegram:

© Habrahabr.ru