Файл plugin.php в Cotonti

включает необходимые файлы плагина, и затем обрабатывает вывод в зависимости от того, как плагин должен отображаться

Основное назначение кода в файле plugin.php в системной папке Cotonti CMF — это обработка плагинов в рамках фреймворка. Он загружает плагин, проверяет права доступа, включает необходимые файлы плагина, и затем обрабатывает вывод в зависимости от того, как плагин должен отображаться (например, в виде всплывающего окна, через AJAX или как отдельная страница).

Вот основные моменты, которые раскрывает данный код:

  1. Параметры запроса и обработка входных данных:
    • Код получает входные данные через глобальные массивы $_GET и $_POST, например, такие как e, o, r, c1, c2 — это параметры, которые используются для определения, какой плагин загружать и как его отображать.
  2. Проверка доступности плагина и прав пользователя:
    • Перед тем как загружать плагин, выполняется проверка прав пользователя с использованием функции cot_auth. Только те пользователи, которые имеют соответствующие права, могут просматривать или взаимодействовать с плагином.
  3. Автозагрузка файлов плагина:
    • Автоматически подключаются необходимые файлы плагина (например, языковые файлы, ресурсы или функции), если такие файлы существуют.
  4. Настройка шаблона и вывод:
    • В зависимости от типа плагина, его вывод может быть настроен через шаблон, который затем заполняется данными и выводится на странице.
  5. Режим совместимости:
    • В коде присутствуют проверки на включение режима совместимости с предыдущими версиями (например, использование старых переменных и параметров), что позволяет обеспечить поддержку устаревших функций.

Характеристика стиля PHP:

  • Использование глобальных переменных: Код активно использует глобальные массивы, такие как $_GET, $_POST, и Cot::$sys. Это позволяет интегрировать плагин в систему с максимально гибким подходом.

  • Условные конструкции: Применяются сложные условные конструкции для обработки различных сценариев загрузки плагинов (например, проверка наличия параметров и режима совместимости).

  • Работа с шаблонами: Используется объект XTemplate для обработки шаблонов и вывода данных на страницу, что характерно для фреймворков, ориентированных на разделение логики и представления.

  • Использование функций фреймворка: Применяются встроенные функции фреймворка Cotonti, такие как cot_import, cot_langfile, cot_breadcrumbs и другие, что позволяет интегрировать код с остальной системой.

  • Проверки и обработки ошибок: В коде присутствуют механизмы для обработки ошибок (например, проверка на существование файлов и проверка прав доступа с использованием функции cot_die_message).

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

 

 

/**
 * Plugin loader
 *
 * @package Cotonti
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */
// Загрузчик плагинов
//
// @package Cotonti
// @copyright (c) Cotonti Team
// @license https://github.com/Cotonti/Cotonti/blob/master/License.txt

defined('COT_CODE') or die('Wrong URL'); // Проверка, что код выполняется в правильном контексте (COT_CODE должен быть определён)

// Input import
$e = cot_import('e', 'G', 'ALP'); // Получение параметра 'e' из GET-запроса с фильтрацией
$o = cot_import('o', 'G', 'ALP'); // Получение параметра 'o' из GET-запроса с фильтрацией
$r = (isset($_POST['r'])) ? cot_import('r','P','ALP') : cot_import('r','G','ALP'); // Получение параметра 'r' из POST, если он существует, или из GET
$c1 = cot_import('c1', 'G', 'ALP'); // Получение параметра 'c1' из GET-запроса с фильтрацией
$c2 = cot_import('c2', 'G', 'ALP'); // Получение параметра 'c2' из GET-запроса с фильтрацией

$autoAssignTags = false; // Флаг для автоматической привязки тегов, по умолчанию выключен
$templateFile = ''; // Переменная для хранения пути к шаблону, изначально пустая
if (!empty($o)) { // Если параметр 'o' не пустой
	$extensionCode = $o; // Присваиваем переменной extensionCode значение 'o'
    $hook = 'popup'; // Устанавливаем хук для всплывающих окон
    Cot::$sys['displayHeader'] = Cot::$sys['displayFooter'] = false; // Отключаем отображение заголовка и подвала
    $templateFile = cot_tplfile(['popup', $extensionCode]); // Определяем файл шаблона для popup
    $autoAssignTags = true; // Включаем автоматическую привязку тегов

} elseif (!empty($r)) { // Если параметр 'r' не пустой
	$extensionCode = $r; // Присваиваем переменной extensionCode значение 'r'
    $hook = 'ajax'; // Устанавливаем хук для AJAX
    Cot::$sys['displayHeader'] = Cot::$sys['displayFooter'] = false; // Отключаем отображение заголовка и подвала

} elseif (!empty($e)) { // Если параметр 'e' не пустой
	$extensionCode = $e; // Присваиваем переменной extensionCode значение 'e'
    $hook = 'standalone'; // Устанавливаем хук для standalone (отдельная страница)
    $templateFile = cot_tplfile($extensionCode, 'plug'); // Определяем файл шаблона для плагина
    if ($templateFile === null || !file_exists($templateFile)) { // Если файл шаблона не существует
        $templateFile = cot_tplfile(['plugin', $extensionCode]); // Пытаемся найти шаблон для плагина
        $autoAssignTags = true; // Включаем автоматическую привязку тегов
    }
} else { // Если ни один из параметров не задан
	cot_die_message(404); // Вызываем ошибку 404 (не найдено)
}

if (!file_exists(Cot::$cfg['plugins_dir'] . '/' . $extensionCode)) { // Проверяем существование плагина в каталоге плагинов
	cot_die_message(404); // Если плагин не найден, выводим ошибку 404 (не найдено)
}

 

// Начальная проверка прав доступа
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('plug', Cot::$env['ext']); // Проверка прав пользователя на чтение, запись и администрирование плагина
cot_block(Cot::$usr['auth_read']); // Проверка, есть ли у пользователя право на чтение плагина

// Автоматическая загрузка требуемых файлов плагина
$requiredFiles = [ // Массив файлов, которые необходимо подключить для плагина
    cot_langfile($extensionCode, 'plug'), // Подключение языкового файла плагина
    cot_incfile($extensionCode, 'plug', 'resources'), // Подключение файла ресурсов плагина
    cot_incfile($extensionCode, 'plug', 'functions'), // Подключение файла функций плагина
];
foreach ($requiredFiles as $requiredFile) { // Перебор всех файлов для подключения
	if (file_exists($requiredFile)) { // Если файл существует
		require_once $requiredFile; // Подключаем файл
	}
}

// Отображение
$pluginBreadCrumbs = []; // Массив для хлебных крошек плагина
$pluginTitle = ''; // Заголовок плагина
$pluginSubtitle = ''; // Подзаголовок плагина
$pluginBody = ''; // Тело плагина
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включён режим совместимости
    // @deprecated in 0.9.25
    $plugin_subtitle = ''; // Устаревшая переменная для подзаголовка
    $plugin_body = ''; // Устаревшая переменная для тела плагина
    $popup_body = ''; // Устаревшая переменная для всплывающего окна
}

$t = null; // Инициализация переменной для шаблона
if (!empty($templateFile)) { // Если задан путь к шаблону
	$t = new XTemplate($templateFile); // Создаём объект шаблона
}

$found = false; // Флаг для проверки, найден ли плагин
if (!empty($cot_plugins[$hook]) && is_array($cot_plugins[$hook])) { // Если для текущего хука существуют плагины
    if (Cot::$cfg['debug_mode']) { // Если включён режим отладки
        $cotHooksFired[] = $hook; // Добавляем хук в массив вызванных хуков
    }
	foreach ($cot_plugins[$hook] as $extensionRow) { // Перебираем плагины для текущего хука
		if ($extensionRow['pl_code'] == $extensionCode) { // Если код плагина совпадает с текущим
			$out['plu_title'] = $extensionRow['pl_title']; // Присваиваем заголовок плагина
            $filename = Cot::$cfg['plugins_dir'] . '/' . $extensionRow['pl_file']; // Формируем путь к файлу плагина
            if (is_readable($filename)) { // Если файл плагина доступен для чтения
                include Cot::$cfg['plugins_dir'] . '/' . $extensionRow['pl_file']; // Подключаем файл плагина
                $found = true; // Устанавливаем флаг, что плагин найден
                break; // Прерываем цикл
            }
		}
	}
}
if (!$found) { // Если плагин не найден
	cot_die_message(404); // Выводим ошибку 404 (не найдено)
}

 

if (empty($out['subtitle'])) { // Если подзаголовок ещё не задан
	if (empty(Cot::$L['plu_title']) && isset(Cot::$L[$extensionCode . '_title'])) { // Если заголовок плагина не задан и существует локализованный заголовок плагина
        Cot::$L['plu_title'] = Cot::$L[$extensionCode . '_title']; // Присваиваем заголовок из локализованного массива
	}
    Cot::$out['subtitle'] = empty(Cot::$L['plu_title']) ? Cot::$out['plu_title'] : Cot::$L['plu_title']; // Если локализованный заголовок пуст, используем заголовок по умолчанию
}
Cot::$sys['sublocation'] = Cot::$out['subtitle']; // Устанавливаем подлокацию в системный массив

if ($autoAssignTags) { // Если автоматическое назначение тегов включено
	array_unshift($pluginBreadCrumbs, [cot_url($e), Cot::$out['subtitle']]); // Добавляем хлебные крошки в начало массива
	if (empty($o)) { // Если не задан параметр $o
        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
            // @deprecated in 0.9.25
            if (!empty($plugin_subtitle)) { // Если подзаголовок плагина задан
                $pluginTitle = $plugin_subtitle; // Присваиваем подзаголовок как заголовок плагина
            }
            if (!empty($plugin_body)) { // Если тело плагина задано
                $pluginBody = $plugin_body; // Присваиваем тело плагина
            }
        }
		$t->assign([ // Назначаем значения в шаблон
			'BREADCRUMBS' => cot_breadcrumbs($pluginBreadCrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки
			'TITLE' => $pluginTitle, // Заголовок плагина
            'SUBTITLE' => $pluginSubtitle, // Подзаголовок плагина
			'BODY' => $pluginBody, // Тело плагина
		]);
        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
            // @deprecated in 0.9.25
            $t->assign([ // Назначаем устаревшие значения в шаблон
                'PLUGIN_TITLE' => cot_breadcrumbs($pluginBreadCrumbs, Cot::$cfg['homebreadcrumb']),
                'PLUGIN_SUBTITLE' => $pluginTitle,
                'PLUGIN_BODY' => $pluginBody,
            ]);
        }
	} else { // Если задан параметр $o
        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
            // @deprecated in 0.9.25
            if (!empty($popup_body)) { // Если тело всплывающего окна задано
                $pluginBody = $popup_body; // Присваиваем тело всплывающего окна
            }
        }

		cot_sendheaders(); // Отправка заголовков
		$t->assign([ // Назначаем значения в шаблон
			'POPUP_C1' => $c1, // Параметр для всплывающего окна
			'POPUP_C2' => $c2, // Параметр для всплывающего окна
			'BODY' => $pluginBody, // Тело плагина
		]);

        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
            // @deprecated in 0.9.25
            $t->assign([ // Назначаем устаревшие значения для всплывающего окна
                'POPUP_BODY' => $pluginBody,
            ]);
        }
	}
}

$pluginTemplate = $t ?? null; // Если шаблон плагина существует, сохраняем его в переменную
require_once Cot::$cfg['system_dir'] . '/header.php'; // Подключаем файл header.php для начала страницы
if (!empty($pluginTemplate)) { // Если шаблон плагина существует
    $t = $pluginTemplate; // Присваиваем шаблон плагина
}
unset($pluginTemplate); // Удаляем переменную с шаблоном плагина

if (isset($t) && is_object($t)) { // Если объект шаблона существует
	$t->parse('MAIN'); // Парсим основной блок шаблона
	$t->out('MAIN'); // Выводим основной блок шаблона
}

require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключаем файл footer.php для окончания страницы

 

 

 

 

8 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-24 14:02
  • Last update: 2025-01-24 14:06

Similar pages

Загрузчик плагина (Plugin loader) в Cotonti Siena CMF
1 Обзор загрузчика и Введение в систему плагинов CotontiПодробный разбор самой концепции инициализации плагинов и анализ
Cotonti Siena CMF • 2026-03-10 11:22 webitproff
AjaxPopover plugin Плагин
2 AjaxPopover plugin Плагин для фриланс-биржи на Cotonti При наведении на ссылку, всплывает доп. информация, например, на
User Blog • 2020-07-17 05:15 webitproff
Fast Passrecover plugin Плагин
3 Fast Passrecover plugin Плагин для фриланс-биржи на Cotonti Пропускает этап подтверждения смены пароля Данный плагин
User Blog • 2020-07-17 05:15 webitproff
reCaptcha API 2.0 plugin
4 reCaptcha API 2.0 plugin для фриланс-биржи на Cotonti Стильная Google reCaptcha теперь и для Cotonti Порядок
User Blog • 2020-07-17 05:15 webitproff