Данный класс предназначен для подключения произвольного кода в системные файлы, не изменяя последние. Он появился в версии XOOPS 2.4.0.
Объявление класса:
$xoopsPreload =& XoopsPreload::getInstance();
Методы:
Конструктор
function XoopsPreload()
{
$this->setPreloads();
$this->setEvents();
}
@return void
Объявление
function &getInstance()
{
static $instance = false;
if (!$instance) {
$instance = new XoopsPreload();
}
return $instance;
}
@return object
Объявление класса. Разрешено только один раз. Возвращает объект.
Получение информации
function setPreloads()
{
$modules_list = XoopsLists::getDirListAsArray(XOOPS_ROOT_PATH . "/modules/");
$i = 0;
foreach ($modules_list as $module) {
if (is_dir($dir = XOOPS_ROOT_PATH . "/modules/{$module}/preloads/")) {
$file_list = XoopsLists::getFileListAsArray($dir);
foreach ($file_list as $file) {
if (preg_match('/(\.php)$/i', $file)) {
$file = substr($file, 0, -4);
$this->_preloads[$i]['module'] = $module;
$this->_preloads[$i]['file'] = $file;
$i++;
}
}
}
}
}
@return void
Сначала идёт получение списка модулей в папке modules.
Если существует папка "/modules/{$module}/preloads/", то идёт получение списка файлов в ней.
Если данный файл является *.php файлов, то из имени файла удаляется расширение .php и заносится информация в массив:
$this->_preloads[$i]['module'] = $module; (имя папки с модулем)
$this->_preloads[$i]['file'] = $file; (имя файла без .php)
function setEvents()
{
foreach ($this->_preloads as $preload) {
include_once XOOPS_ROOT_PATH . '/modules/' . $preload['module'] . '/preloads/' . $preload['file']. '.php';
$class_name = ucfirst($preload['module']) . ucfirst($preload['file']) . 'Preload' ;
if (!class_exists($class_name)) {
continue;
}
$class_methods = get_class_methods($class_name);
foreach ($class_methods as $method) {
if (strpos($method, 'event') === 0) {
$event_name = strtolower(str_replace('event', '', $method));
$event= array('class_name' => $class_name, 'method' => $method);
$this->_events[$event_name][] = $event;
}
}
}
}
Идёт переборка массива $this->_preloads.
Подключается файл (плагин) '/modules/' . $preload['module'] . '/preloads/' . $preload['file']. '.php'.
Если в данном файле нет класса Папка_модуляИмя_файлаPreload цикл продолжается дальше.
Если данный класс есть, то получаем массив имён методов данного класса.
Перебираем все методы из массива, если имя данного метода начинается с event , то заносим информацию об классе и его методах в массив:
$event_name = strtolower(str_replace('event', '', $method));
$event= array('class_name' => $class_name, 'method' => $method);
$this->_events[$event_name][] = $event;
Вызов событий
function triggerEvent($event_name, $args = array())
{
$event_name = strtolower(str_replace('.', '', $event_name));
if (isset($this->_events[$event_name])) {
foreach ($this->_events[$event_name] as $event) {
call_user_func(array($event['class_name'], $event['method']), $args);
}
}
}
@param $event_name string Name of the event to trigger
@param $args array Method arguments
@return void
Данный метод вызывает события, которые нужно сделать в данном месте кода.
Принимает название события (строка) и аргументы, которые нужно передать (массив).
В названии события все удаляются все точки.
Если есть массив для данного события $this->_events[$event_name] , то перебираем его.
Вызываем все методы класса, которые принадлежат этому событию и передаём им параметры:
call_user_func(array($event['class_name'], $event['method']), $args);
|