Файл header.php в Cotonti
отвечает за формирование и обработку заголовка страницы сайта, который зависит от состояния пользователя (авторизован он или нет)
Файл header.php в системной папке Cotonti CMF отвечает за формирование и обработку заголовка страницы сайта, который зависит от состояния пользователя (авторизован он или нет). Основные задачи этого файла включают:
-
Обработка данных авторизованных пользователей:
- Если пользователь авторизован, в шаблон передаются ссылки на панель администратора, профиль пользователя и возможность выйти из системы.
- Также отображаются данные о пользователе, такие как имя и количество сообщений.
-
Обработка данных для гостей:
- Если пользователь не авторизован, создаются формы для ввода имени и пароля, а также ссылки на страницу регистрации и настройки сессии (например, для запоминания пользователя).
-
Использование плагинов:
- В коде предусмотрено место для подключения плагинов, которые могут изменять содержимое заголовка (как для авторизованных пользователей, так и для гостей).
-
Шаблонная система:
- Используется шаблонный движок (переменная
$t), с помощью которого передаются значения в соответствующие теги в шаблон.
- Используется шаблонный движок (переменная
-
Динамическая генерация URL:
- Код динамически генерирует URL для различных действий (выход из системы, профиль пользователя, регистрация и т. д.).
-
Хуки:
- Применяются хуки (например,
cot_getextplugins), которые позволяют подключать дополнительные плагины на разных этапах генерации заголовка.
- Применяются хуки (например,
Стиль PHP:
-
Использование встроенных функций и глобальных переменных: Код активно использует глобальные переменные (
Cot::$usr,Cot::$out,Cot::$R,Cot::$cfgи другие) и встроенные функции фреймворка Cotonti для выполнения задач (например,cot_url,cot_rc_link,cot_xg, и другие). -
Теговая система для шаблонов: В коде широко используется система тегов, где данные передаются в шаблон через методы
$t->assign, и шаблон обрабатывается с помощью$t->parse. -
Условная логика: Код использует простую условную логику для различения между авторизованным пользователем и гостем. В зависимости от состояния пользователя, выполняются разные действия.
-
Работа с плагинами: В коде предусмотрена поддержка плагинов для различных разделов (например,
header.user.tags,header.guest.tagsи т. д.), что позволяет легко расширять функционал без необходимости изменения основного кода. -
Комментарии: Код не содержит подробных комментариев, что делает его менее понятным для новичков, но в целом структура и логика достаточно понятны и разделены по блокам.
Характеристика стиля:
-
Объектно-ориентированный подход: Хотя код в целом больше ориентирован на использование процедурного стиля, есть элементы объектно-ориентированного подхода (например, использование статических свойств классов, таких как
Cot::$usr). -
Модульность: Код хорошо структурирован и делится на небольшие части (например, обработка данных для пользователя и для гостя), что позволяет легко поддерживать и расширять функционал.
-
Интеграция с фреймворком Cotonti: Стиль программирования ориентирован на использование фреймворка, с интеграцией его системных функций и хуков, что позволяет легко подключать расширения и адаптировать код под нужды конкретного сайта.
Этот код отвечает за глобальную обработку заголовка страницы в системе Cotonti. В нём проводится несколько проверок и подключений, а также извлекается информация о типе контента, который был отправлен сервером.
/**
* Global header
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
// Глобальный заголовок
// Упаковано для Cotonti
// Авторские права (с) Cotonti Team
// Лицензия: https://github.com/Cotonti/Cotonti/blob/master/License.txt
defined('COT_CODE') or die('Wrong URL');
// Проверка, что код вызывается в правильном контексте, иначе выводится ошибка "Неверный URL"
cot_uriredir_store();
// Вызов функции для сохранения редиректа URL
/* === Hook === */
foreach (cot_getextplugins('header.first') as $pl) {
include $pl;
}
/* ===== */
// Загружаются плагины, подключённые на хук 'header.first' (выполняются перед основной логикой заголовка)
$contentTypeSent = '';
// Инициализация переменной для хранения типа контента
foreach (headers_list() as $header) {
$header = mb_strtolower($header);
// Перебор всех заголовков, преобразуем в нижний регистр для дальнейшей обработки
if (mb_strpos($header, 'content-type') !== false) {
// Проверка, содержит ли заголовок 'content-type'
$parts = explode(';', $header);
// Разделяем заголовок по символу ";"
$parts = array_map('trim', $parts);
// Убираем пробелы вокруг элементов массива
if (!empty($parts[0])) {
// Если первый элемент не пустой
$contentTypeParts = explode(':', $parts[0]);
// Разделяем первый элемент на тип контента и параметры
$contentTypeSent = trim($contentTypeParts[1]);
// Извлекаем тип контента и убираем пробелы
}
unset($parts, $contentTypeParts);
// Освобождение памяти, удаление временных переменных
break;
// Прерываем цикл, так как нужный заголовок найден
}
}
if (empty(Cot::$out['contentType'])) {
// Проверка, если в выводе не задан тип контента
if ($contentTypeSent !== '') {
// Если тип контента был извлечен ранее
Cot::$out['contentType'] = $contentTypeSent;
// Устанавливаем тип контента из ранее извлечённого значения
} else {
// Если тип контента не был найден
Cot::$out['contentType'] = Cot::$cfg['xmlclient'] ? 'application/xml' : 'text/html';
// Устанавливаем тип контента в зависимости от настроек: XML или HTML
}
}
if (!headers_sent()) {
// Проверка, если заголовки ещё не были отправлены
cot_sendheaders(
Cot::$out['contentType'] !== $contentTypeSent ? Cot::$out['contentType'] : '',
// Отправляем тип контента, если он отличается от исходного
!empty(Cot::$env['status']) ? Cot::$env['status'] : '200 OK',
// Отправляем статус, если он задан, иначе по умолчанию '200 OK'
!empty(Cot::$env['last_modified']) ? Cot::$env['last_modified'] : 0
// Отправляем дату последнего изменения, если она задана
);
}
Этот участок кода занимается проверкой и установкой типа контента, который будет отправлен в ответе, а также отправкой заголовков, если они ещё не были отправлены. Если тип контента не был задан явно, он определяется на основе настроек. Также выполняется отправка HTTP-заголовков, включая статус и дату последнего изменения.
if (Cot::$sys['displayHeader']) {
// Проверка, нужно ли отображать заголовок
Cot::$out['logstatus'] = (Cot::$usr['id'] > 0)
? Cot::$L['hea_youareloggedas'] . ' ' . Cot::$usr['name']
: Cot::$L['hea_youarenotlogged'];
// Устанавливаем статус логина: если пользователь авторизован, выводим его имя, иначе — сообщение о том, что он не авторизован.
Cot::$out['userlist'] = (cot_auth('users', 'a', 'R'))
? cot_rc_link(cot_url('users'), Cot::$L['Users'])
: '';
// Если у пользователя есть права на просмотр списка пользователей, генерируем ссылку на страницу пользователей, иначе оставляем пустую строку.
unset($title_tags, $title_data);
// Убираем переменные, связанные с тегами и данными заголовка, если они есть.
Cot::$out['subtitle'] = isset(Cot::$out['subtitle']) ? Cot::$out['subtitle'] : '';
// Если подзаголовок существует, оставляем его, иначе присваиваем пустую строку.
Cot::$out['head'] = isset(Cot::$out['head']) ? Cot::$out['head'] : '';
// Если есть дополнительные данные для заголовка, используем их, иначе оставляем пустую строку.
Cot::$out['head_head'] = isset(Cot::$out['head_head']) ? Cot::$out['head_head'] : '';
// Если есть дополнительные данные для тега head, используем их, иначе оставляем пустую строку.
$title_page_num = '';
// Переменная для номера страницы в заголовке
if (!empty($pg) && is_numeric($pg) && $pg > 1) {
// Если номер страницы больше 1, добавляем его в подзаголовок и мета-описание
$title_page_num = htmlspecialchars(cot_rc('code_title_page_num', ['num' => $pg]));
// Получаем форматированное число страницы
Cot::$out['subtitle'] .= $title_page_num;
// Добавляем номер страницы к подзаголовку
}
$title_params = [
'MAINTITLE' => Cot::$cfg['maintitle'],
'DESCRIPTION' => Cot::$cfg['subtitle'],
'SUBTITLE' => Cot::$out['subtitle'],
];
// Создаём массив параметров для формирования заголовка
if (defined('COT_INDEX')) {
// Если мы на главной странице
Cot::$out['fulltitle'] = cot_title('title_header_index', $title_params);
// Формируем заголовок для главной страницы
} else {
Cot::$out['fulltitle'] = cot_title('title_header', $title_params);
// Формируем заголовок для других страниц
}
if (Cot::$cfg['jquery'] && Cot::$cfg['jquery_cdn']) {
// Если включена поддержка jQuery и задан CDN
Resources::linkFile(Cot::$cfg['jquery_cdn'], 'js', 30);
// Подключаем jQuery с указанного CDN
}
$html = Resources::render();
// Получаем HTML для дополнительных ресурсов
if ($html) {
Cot::$out['head_head'] = $html . Cot::$out['head_head'];
// Добавляем полученные ресурсы в начало тега head
}
Cot::$out['basehref'] = Cot::$R['code_basehref'];
// Устанавливаем базовый URL для ссылок
Cot::$out['meta_charset'] = 'UTF-8';
// Устанавливаем кодировку
Cot::$out['meta_desc'] = (empty(Cot::$out['desc'])
? Cot::$cfg['subtitle']
: htmlspecialchars(Cot::$out['desc'])) . $title_page_num;
// Формируем описание для мета-тега, добавляя номер страницы, если нужно
Cot::$out['meta_keywords'] = empty(Cot::$out['keywords'])
? Cot::$cfg['metakeywords']
: htmlspecialchars(Cot::$out['keywords']);
// Формируем мета-теги для ключевых слов
Cot::$out['meta_lastmod'] = gmdate('D, d M Y H:i:s');
// Устанавливаем дату последнего изменения
Cot::$out['head_head'] .= Cot::$out['head'];
// Добавляем содержимое переменной head в head_head
Cot::$out['canonical_uri'] = !empty(Cot::$out['canonical_uri']) ? Cot::$out['canonical_uri'] : '';
// Проверяем, если задан канонический URI, используем его
if (!empty(Cot::$out['canonical_uri']) && !preg_match("#^https?://.+#", Cot::$out['canonical_uri'])) {
Cot::$out['canonical_uri'] = rtrim(COT_ABSOLUTE_URL, '/') . '/'
. ( (Cot::$out['canonical_uri'] !== '/') ? ltrim(Cot::$out['canonical_uri'], '/') : '' );
// Если канонический URI относительный, формируем полный URL
}
if (Cot::$out['canonical_uri'] !== '') {
header('Link: <' . str_replace('&', '&', Cot::$out['canonical_uri'])
. '>; rel="canonical"');
// Если задан канонический URI, добавляем его в заголовок
}
if (!empty(Cot::$sys['noindex'])) {
Cot::$out['head_head'] .= Cot::$R['code_noindex'];
// Если установлено правило noindex, добавляем его в head
}
$mtpl_type = defined('COT_ADMIN') || defined('COT_MESSAGE') && $_SESSION['s_run_admin'] && cot_auth('admin', 'any', 'R') ? 'core' : 'module';
// Определяем тип шаблона: для админки или модуля
if (Cot::$cfg['enablecustomhf']) {
$mtpl_base = (defined('COT_PLUG') && !empty($e)) ? array('header', $e) : array('header', Cot::$env['location']);
// Если включены кастомные заголовки/футеры, формируем базовый шаблон
} else {
$mtpl_base = 'header';
// Если не включены кастомные заголовки/футеры, используем стандартный
}
$t = new XTemplate(cot_tplfile($mtpl_base, $mtpl_type));
// Загружаем шаблон
/* === Hook === */
foreach (cot_getextplugins('header.main') as $pl) {
include $pl;
// Включаем внешние плагины для основного заголовка
}
/* ===== */
if (empty(Cot::$out['notices'])) {
Cot::$out['notices'] = '';
// Если нет уведомлений, устанавливаем пустую строку
}
if (!empty(Cot::$out['notices_array']) && is_array(Cot::$out['notices_array'])) {
$notices = '';
// Если есть массив уведомлений, формируем строку уведомлений
foreach (Cot::$out['notices_array'] as $noticeRow) {
$notice = (is_array($noticeRow)) ? cot_rc('notices_link', array('url' => $noticeRow[0], 'title' => $noticeRow[1])) :
cot_rc('notices_plain', array('title' => $noticeRow));
// Формируем ссылку или обычное уведомление в зависимости от типа уведомления
$notices .= cot_rc('notices_notice', array('notice' => $notice));
// Добавляем уведомление в общий список
}
Cot::$out['notices'] .= cot_rc('notices_container', array('notices' => $notices));
// Добавляем контейнер для уведомлений
}
$t->assign([
'HEADER_TITLE' => Cot::$out['fulltitle'],
'HEADER_COMPOPUP' => !empty(Cot::$out['compopup']) ? Cot::$out['compopup'] : '',
'HEADER_LOGSTATUS' => Cot::$out['logstatus'],
'HEADER_TOPLINE' => Cot::$cfg['topline'],
'HEADER_BANNER' => Cot::$cfg['banner'],
'HEADER_GMTTIME' => Cot::$usr['gmttime'],
'HEADER_USERLIST' => Cot::$out['userlist'],
'HEADER_NOTICES' => Cot::$out['notices'],
'HEADER_NOTICES_ARRAY' => !empty(Cot::$out['notices_array']) ? Cot::$out['notices_array'] : [],
'HEADER_BASEHREF' => Cot::$out['basehref'],
'HEADER_META_CONTENTTYPE' => Cot::$out['contentType'],
'HEADER_META_CHARSET' => Cot::$out['meta_charset'],
'HEADER_META_DESCRIPTION' => Cot::$out['meta_desc'],
'HEADER_META_KEYWORDS' => Cot::$out['meta_keywords'],
'HEADER_META_LASTMODIFIED' => Cot::$out['meta_lastmod'],
'HEADER_HEAD' => Cot::$out['head_head'],
'HEADER_CANONICAL_URL' => !empty(Cot::$out['canonical_uri']) ? Cot::$out['canonical_uri'] : '',
'HEADER_PREV_URL' => !empty(Cot::$out['prev_uri']) ? Cot::$out['prev_uri'] : '',
'HEADER_NEXT_URL' => !empty(Cot::$out['next_uri']) ? Cot::$out['next_uri'] : '',
'HEADER_COLOR_SCHEME' => cot_schemeFile(),
]);
/* === Hook === */
foreach (cot_getextplugins('header.body') as $pl) {
include $pl;
// Включаем плагины для тега body
}
/* ===== */
if (Cot::$usr['id'] > 0) {
// Если пользователь авторизован
Cot::$out['adminpanel'] = (cot_auth('admin', 'any', 'R')) ?
cot_rc_link(cot_url('admin'), Cot::$L['Administration']) : '';
// Если у пользователя есть права на доступ к панели администратора, генерируем ссылку на панель, иначе оставляем пустую строку
Cot::$out['loginout_url'] = cot_url('login', 'out=1&' . cot_xg());
// Формируем URL для выхода из системы
Cot::$out['loginout'] = cot_rc_link(Cot::$out['loginout_url'], Cot::$L['Logout']);
// Генерируем ссылку на выход из системы
Cot::$out['profile'] = cot_rc_link(cot_url('users', 'm=profile'), Cot::$L['Profile']);
// Генерируем ссылку на профиль пользователя
$t->assign(array(
'HEADER_USER_NAME' => Cot::$usr['name'],
'HEADER_USER_ADMINPANEL' => Cot::$out['adminpanel'],
'HEADER_USER_ADMINPANEL_URL' => cot_url('admin'),
'HEADER_USER_LOGINOUT' => Cot::$out['loginout'],
'HEADER_USER_LOGINOUT_URL' => Cot::$out['loginout_url'],
'HEADER_USER_PROFILE' => Cot::$out['profile'],
'HEADER_USER_PROFILE_URL' => cot_url('users', 'm=profile'),
'HEADER_USER_MESSAGES' => Cot::$usr['messages']
));
// Передаем данные о пользователе в шаблон
/* === Hook === */
foreach (cot_getextplugins('header.user.tags') as $pl) {
include $pl;
// Включаем внешние плагины для пользовательских тегов
}
/* ===== */
$t->parse('HEADER.USER');
// Обрабатываем шаблон для авторизованного пользователя
} else {
// Если пользователь не авторизован
Cot::$out['guest_username'] = Cot::$R['form_guest_username'];
// Задаем поле для имени гостя
Cot::$out['guest_password'] = Cot::$R['form_guest_password'];
// Задаем поле для пароля гостя
Cot::$out['guest_register'] = cot_rc_link(cot_url('users', 'm=register'), Cot::$L['Register']);
// Генерируем ссылку на страницу регистрации для гостей
Cot::$out['guest_cookiettl'] = Cot::$cfg['forcerememberme'] ? Cot::$R['form_guest_remember_forced']
: Cot::$R['form_guest_remember'];
// Если включено принудительное запоминание пароля, показываем соответствующее поле
$t->assign([
'HEADER_GUEST_SEND' => cot_url('login', 'a=check&' . Cot::$sys['url_redirect']),
'HEADER_GUEST_USERNAME' => Cot::$out['guest_username'],
'HEADER_GUEST_PASSWORD' => Cot::$out['guest_password'],
'HEADER_GUEST_REGISTER' => Cot::$out['guest_register'],
'HEADER_GUEST_REGISTER_URL' => cot_url('users', 'm=register'),
'HEADER_GUEST_COOKIETTL' => Cot::$out['guest_cookiettl'],
]);
// Передаем данные для гостевого входа в шаблон
/* === Hook === */
foreach (cot_getextplugins('header.guest.tags') as $pl) {
include $pl;
// Включаем внешние плагины для тегов гостя
}
/* ===== */
$t->parse('HEADER.GUEST');
// Обрабатываем шаблон для гостя
}
/* === Hook === */
foreach (cot_getextplugins('header.tags') as $pl) {
include $pl;
// Включаем внешние плагины для тегов общего заголовка
}
/* ===== */
$t->parse('HEADER');
// Обрабатываем общий шаблон заголовка
$t->out('HEADER');
// Выводим заголовок
}
/* === Hook === */
foreach (cot_getextplugins('header.last') as $pl) {
include $pl;
// Включаем внешние плагины в конце
}
/* ===== */
define('COT_HEADER_COMPLETE', TRUE);
// Определяем, что заголовок завершен
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 24.01.2025 14:10
- Последнее обновление: 24.01.2025 14:20