Метод подключения файлов из своей библиотеки при помощиjimport имеет два недостатка:

  • библиотека должна быть расположена в каталоге librares
  • необходимость при каждом подключении файла писать 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');
}
}



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