В статье "Техники быстрой разработки: предотвращение фрагментации кода в Joomla" был рассмотрен метод подключения файлов из своей библиотеки при помощи jimport. Он работает, но имеет два недостатка:

  • внесение изменения в файл ядра loader.php
  • необходимость при каждом подключении файла писать jimport

Обойти эти недостатки нам поможет класс JLoader. Он предоставляет возможность подключать отдельные классы и целые библиотеки с помощью автозагрузчика классов Joomla. Предположим, что файлы вашей библиотеки расположены в /libraries/mylib. Давайте рассмотрим различные способы использования автозагрузчика для подключения классов из нашей библиотеки и облегчения работы при разработке расширений.

Регистрация классов

С помощью метода register() вы можете добавить конкретный класс в автозагрузчик:

JLoader::register('MylibUser', JPATH_LIBRARIES . '/mylib/user.php');

 

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

Поиск классов

Этот способ позволяет подключить целую библиотеку. Метод discover() смотрит на имена файлов в папке и регистрирует классы, основываясь на этих именах.

 

// Регистрируем все файлы в папке /libraries/mylib как классы с именем Mylib<имяфайла>
JLoader::discover('Mylib', JPATH_LIBRARIES . '/mylib');

 

Как видите, этот метод работает, если вы следуете определенному именованию файлов и классов:

/mylib/user.php равно классу MylibUser
/mylib/userhelper.php равно классу MylibUserHelper
и т.д.

Дополнительные аргументы позволяют обновить путь уже зарегистрированного класса и рекурсивно пройтись по поддиректориям:

 

// Регистрируем все файлы в папке /libraries/mylib, а также в подпапках как классы с именем Mylib<имяфайла>
JLoader::discover('Mylib', JPATH_LIBRARIES . '/mylib', false, true);

 

Загрузка классов через регистрацию префикса

Начиная с версии Joomla Platform 12.1 (Joomla CMS 3+) существует возможность зарегистрировать префикс класса, по которому автозагрузчик будет искать классы вашей библиотеки (до этого была поддержка только префикса "J", который привязан к папке /libraries/joomla). Это позволяет нам сделать следующее:

  • зарегистрировать префикс своих классов и корневой путь до них;
  • зарегистрировать дополнительный путь для существующего префикса (например, это позволяет Joomla CMS использовать дополнительные библиотеки, при этом используя префикс "J");
  • зарегистрировать переопределение префикса. Это может быть использовано для переопределения базовых классов.

Чтобы использовать метод registerPrefix() необходимо следовать определенному соглашению по именованию классов и файлов. Имя класса должно быть в camel case, где каждый сегмент имени представляет путь к папке, а последний сегмент является именем файла класса. Если в имени класса только одна часть, то автозагрузчик будет искать файл в папке с таким же названием. Названия папок должны быть в нижнем регистре.

Например:

Класс PrefixUserModel должен находиться в ПУТЬ_ДО_ПРЕФИКСА/user/model.php
Класс PrefixUser должен находиться в ПУТЬ_ДО_ПРЕФИКСА /user/user.php

Применительно к нашему примеру:

Класс MylibUserHelper должен находиться в /libraries/mylib/user/helper.php
Класс MylibUser должен находиться в /libraries/mylib/user/user.php

 

// Ищем классы, начинающиеся с "Mylib" в папке /libraries/mylib.
JLoader::registerPrefix('Mylib', JPATH_LIBRARIES . '/mylib');

 

 

// Ищем классы с префиксом "J" дополнительно в папке /libraries/cms.
JLoader::registerPrefix('J', JPATH_PLATFORM . '/cms');

 

 

// Сбрасываем префикс "J" и указываем на свой форк платформы.
JLoader::registerPrefix('J', '/my/platform/fork', true);

 

Обратите внимание на то, что такие акронимы как HTML, XML и MySQL в названиях классов тоже должны придерживаться соглашения camel case: HTML становится Html, XML становится Xml и т.д.

Доступ к библиотеке из любой точки Joomla

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

 

class plgSystemMylib extends JPlugin
{
    public function onAfterInitialise()
    {
        JLoader::registerPrefix('Mylib', JPATH_LIBRARIES . '/mylib');
    }
}

 

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

Удачной вам разработки!