---
title: "Подключение сторонних PHP библиотек в Joomla - WebTolk"
description: "Joomla и PHP SDK. Как подключить php библиотеку в Joomla правильно? Примеры кода, советы. Joomla и Symfony."
url: "https://web-tolk.ru/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla"
date: "2024-10-17T20:06:55+00:00"
language: "ru-RU"
---

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

 Автор: Сергей Толкачев Создано: 18 октября 2024 Обновлено: 01 сентября 2025 Просмотров: 1351    ![](https://web-tolk.ru/blog/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/header.webp)

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

## Composer

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

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

 ![](https://web-tolk.ru/blog/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/joomla-extension-changlog-view.webp)Просмотр **Changelog** расширения в админке ДО обновления в Joomla 5.

## Joomla, PSR, Symfony

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

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

Ничего сложного. Файлы библиотеки как правило находятся в папке src. Рядом с этой папкой нужно создать XML-манифест расширения Joomla [согласно документации (manual.joomla.org)](https://manual.joomla.org/docs/building-extensions/install-update/installation/manifest). Затем пакуем всё в zip-архив и готово! Можно устанавливать.

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

```
<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" method="upgrade">
     <name>WebTolk AmoCRM library</name>
     <libraryname>Webtolk/Amocrm</libraryname>
     <version>1.2.1</version>
     ...
     <namespace path="src">Webtolk\Amocrm</namespace>
     <files>
          <folder>src</folder>
          <filename>amocrm.xml</filename>
     </files>
</extension>
```

Тег `<libraryname>` означает, что папка `src` из нашего архива будет скопирована в `JPATH_SITE/libraries/Webtolk/Amocrm`. В секции `<files>` мы указываем **что** из архива туда нужно положить. А `<namespace path="src">Webtolk\Amocrm</namespace>` говорит, что для папки `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 расширения.

```
<?php
use Joomla\CMS\Helper\LibraryHelper;
use Joomla\CMS\Cache\Cache;

/**
 * Function called before extension installation/update/removal procedure commences.
 *
 * @param   string            $type     The type of change (install or discover_install, update, uninstall)
 * @param   InstallerAdapter  $adapter  The adapter calling this method
 *
 * @return  boolean  True on success
 *
 * @since   1.0.0
 */
public function preflight(string $type, InstallerAdapter $adapter): bool
{
    if ($type == 'uninstall')
    {
        return true;
    }

    /**
     *
     *  Joomla при обновлении расширений типа library по факту удаляет их (вместе с данными в базе),
     *  а потом устанавливает заново.
     *  Дабы избежать потерь данных библиотеки из базы пишем этот костыль.
     *
     * @see https://github.com/joomla/joomla-cms/issues/39360
     *
     */

    if ($type == 'update')
    {
        $lib_params = LibraryHelper::getParams('Webtolk/Amocrm');
        $jconfig    = $this->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 не имеет). Либо системный, либо своей кастомной группы - не важно. Внутри своей библиотеки получать параметры плагина довольно быстро можно так:

```
<?php
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Registry\Registry;

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

В заключение хочу поделиться мнением участника Joomla-сообщества, разработчика - Артёма Васильева ([@kernUSR](https://habr.com/users/kernusr) на Хабре), которое он [высказал](https://t.me/joomlaru/606037) в Joomla чате:

[!\[1\](https://web-tolk.ru/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/1.webp)](https://web-tolk.ru/blog/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/1.webp) [!\[2\](https://web-tolk.ru/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/2.webp)](https://web-tolk.ru/blog/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/2.webp) [!\[3\](https://web-tolk.ru/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/3.webp)](https://web-tolk.ru/blog/images/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla/3.webp)

- [Публикация на Хабре](https://habr.com/ru/articles/851520/)

## Об авторе

![Толкачев Сергей Юрьевич](https://web-tolk.ru/images/uslugi/sergey-tolkachyov-apr-2023.webp)

### Толкачев Сергей Юрьевич

Joomla-разработчик. [Контрибьютер ядра Joomla](https://github.com/joomla/joomla-cms/pulls?q=is%3Apr+author%3Asergeytolkachyov+). Один из ведущих Telegram-канала русскоязычного Joomla-сообщества [JoomlaFeed](https://t.me/joomlafeed), один из модераторов [чата русскоязычного Joomla-сообщества](https://t.me/joomlaru). Мои расширения в официальном маркетплейсе расширений Joomla - [Joomla Extensions Directory](https://extensions.joomla.org/profile/profile/details/528051/). Имею публикации в [официальном журнале международного Joomla-сообщества - Joomla Community Magazine](https://magazine.joomla.org/authors/sergeytolkachyov) и на [официальном сайте русскоязычного Joomla-сообщества](https://joomlaportal.ru/users/sergey-tolkachyov).

Муж. Отец 3 детей.

Россия, Саратов.

## JSON-LD Schema

```json
{
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "item": {
                "@id": "https://web-tolk.ru/",
                "name": "Главная"
            }
        },
        {
            "@type": "ListItem",
            "position": 2,
            "item": {
                "@id": "https://web-tolk.ru/blog",
                "name": "Блог"
            }
        },
        {
            "@type": "ListItem",
            "position": 3,
            "item": {
                "name": "Подключение сторонних PHP библиотек в Joomla"
            }
        }
    ]
}
```

```json
{
    "@context": "https://schema.org",
    "@graph": [
        {
            "@type": "Organization",
            "@id": "https://web-tolk.ru/#/schema/Organization/base",
            "name": "WebTolk",
            "url": "https://web-tolk.ru/",
            "logo": {
                "@type": "ImageObject",
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo",
                "url": "images/webtolk-1080p.jpg",
                "contentUrl": "images/webtolk-1080p.jpg",
                "width": 1920,
                "height": 1080
            },
            "image": {
                "@id": "https://web-tolk.ru/#/schema/ImageObject/logo"
            },
            "sameAs": [
                "https://github.com/WebTolk",
                "https://github.com/sergeytolkachyov",
                "https://vk.com/web_tolk",
                "https://vk.com/webtolkru",
                "https://tenchat.ru/sergeytolkachyov",
                "https://t.me/sergeytolkachyov",
                "https://t.me/webtolkru"
            ]
        },
        {
            "@type": "WebSite",
            "@id": "https://web-tolk.ru/#/schema/WebSite/base",
            "url": "https://web-tolk.ru/",
            "name": "WebTolk",
            "publisher": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            }
        },
        {
            "@type": "WebPage",
            "@id": "https://web-tolk.ru/#/schema/WebPage/base",
            "url": "https://web-tolk.ru/blog/podklyuchenie-storonnikh-php-bibliotek-v-joomla",
            "name": "Подключение сторонних PHP библиотек в Joomla - WebTolk",
            "description": "Joomla и PHP SDK. Как подключить php библиотеку в Joomla правильно? Примеры кода, советы. Joomla и Symfony.",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebSite/base"
            },
            "about": {
                "@id": "https://web-tolk.ru/#/schema/Organization/base"
            },
            "inLanguage": "ru-RU",
            "breadcrumb": {
                "@id": "https://web-tolk.ru/#/schema/BreadcrumbList/17"
            }
        },
        {
            "@type": "Article",
            "@id": "https://web-tolk.ru/#/schema/com_content/article/109",
            "isPartOf": {
                "@id": "https://web-tolk.ru/#/schema/WebPage/base"
            }
        }
    ]
}
```
