Файл header.php в Cotonti

отвечает за формирование и обработку заголовка страницы сайта, который зависит от состояния пользователя (авторизован он или нет)

Файл header.php в системной папке Cotonti CMF отвечает за формирование и обработку заголовка страницы сайта, который зависит от состояния пользователя (авторизован он или нет). Основные задачи этого файла включают:

  1. Обработка данных авторизованных пользователей:

    • Если пользователь авторизован, в шаблон передаются ссылки на панель администратора, профиль пользователя и возможность выйти из системы.
    • Также отображаются данные о пользователе, такие как имя и количество сообщений.
  2. Обработка данных для гостей:

    • Если пользователь не авторизован, создаются формы для ввода имени и пароля, а также ссылки на страницу регистрации и настройки сессии (например, для запоминания пользователя).
  3. Использование плагинов:

    • В коде предусмотрено место для подключения плагинов, которые могут изменять содержимое заголовка (как для авторизованных пользователей, так и для гостей).
  4. Шаблонная система:

    • Используется шаблонный движок (переменная $t), с помощью которого передаются значения в соответствующие теги в шаблон.
  5. Динамическая генерация URL:

    • Код динамически генерирует URL для различных действий (выход из системы, профиль пользователя, регистрация и т. д.).
  6. Хуки:

    • Применяются хуки (например, 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('&amp;', '&', 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); 
// Определяем, что заголовок завершен

 

 

 

 

 

 

 

10 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:10
  • Last update: 2025-01-24 14:20

Similar pages

HTML-шаблон header.tpl в Cotonti
1 Основное назначение файла и его место в системе Cotonti: Файл header.tpl — это важный элемент в системе шаблонов
Файл page.header.php в Cotonti
2 описание файла page.header.php в Cotonti CMF  1. Основное назначение и место в системе Cotonti Файл page.header.php
Пользовательский шаблон "шапки" сайта Header.TPL
3 Page My Custom Categories and Articles Header Template (pagemycatheader)Плагин для Cotonti Siena — позволяет гибко