Класс JLoader.
Метод подключения файлов из своей библиотеки при помощиjimport
имеет два недостатка:
- библиотека должна быть расположена в каталоге librares
- необходимость при каждом подключении файла писать
jimport
Обойти эти недостатки нам поможет класс JLoader.
Регистрация классов
С помощью метода 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");
- зарегистрировать переопределение префикса. Это может быть использовано для переопределения базовых классов.
Например:
Класс
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');
}
}
Все просто – после инициализации приложения мы регистрируем наш префикс, и автозагрузчик начинает работать на нас. Теперь в любой точке приложения, будь то модуль, компонент или плагин мы можем получить доступ к классам из нашей библиотеки. Пример полного плагина можно увидеть здесь.