Page My Custom Categories and Articles Header Template (pagemycatheader)



Плагин для Cotonti Siena — позволяет гибко подменять шаблон заголовка header.$location.tpl на страницах выбранной родительской категории Page и всех её дочерних категорий, включая отдельные статьи. Поддерживает автоматическую обработку ЧПУ и URL-параметров (?c=, ?id=), не требует изменений ядра, интегрируется с любой темой.
Пример реализации
Описание и назначение
pagemycatheader — это расширение для Cotonti Siena, которое позволяет:
- Использовать разные шаблоны заголовков (
header.tpl) для различных разделов сайта; - Автоматически подставлять заголовок по выбранной родительской категории и её дочерним;
- Сохранять чистоту структуры — не нужно плодить шаблоны для каждой подкатегории.
Плагин подойдет для сайтов-документаций, блогов, порталов, где важна уникальность заголовка для раздела или группы материалов.
Основные возможности
- Автоматическая подмена header: для страниц, категорий и статей, входящих в дерево выбранной родительской категории;
- ЧПУ поддержка: корректное определение категории из структуры URL;
- Обратная совместимость: работает для старых ссылок вида
?c=категория или ?id=страница; - Гибкая настройка: меняете только один параметр — код родительской категории (
parentcat); - Работает без вмешательства в ядро Cotonti;
- Совместимость: PHP 8.4+, Cotonti Siena ≥0.9.26.
примеры шаблонов
/themes/2waydeal/header.list.tpl
- шаблон по умолчанию для списков страниц (статей) и/в любой категории, если
$cfg['enablecustomhf'] = true;
/themes/2waydeal/header.pages.tpl
- шаблон по умолчанию для любой страницы(статьи) в любой категории, если
$cfg['enablecustomhf'] = true;
/themes/2waydeal/header.tpl
- шаблон по умолчанию, обязательный, НЕ ЗАВИСИТ от
$cfg['enablecustomhf'] = true;
/themes/2waydeal/header.page.user-guide.tpl
- шаблон, который выводим при помощи плагина "pagemycatheader", если
$cfg['enablecustomhf'] = true;
Установка
Копирование файлов
Поместите папку плагина pagemycatheader в plugins/ вашего сайта:
plugins/pagemycatheader/
├─ pagemycatheader.setup.php
├─ pagemycatheader.functions.php
└─ pagemycatheader.header.first.php
- Активация
- Перейдите в админ-панель Cotonti: меню “Плагины”.
- Включите плагин
pagemycatheader.
- Настройка параметра
parentcat
В настройках укажите код родительской категории, например: user-guide.
Это значение должно точно соответствовать коду в структуре. Создание шаблона
Сгенерируйте файл:
themes/ваша_тема/header.page.user-guide.tpl
- Название должно быть строго:
header.page. + код категории + .tpl - Очистка кэша
- После установки или изменений шаблонов очистите кэш Cotonti:
Админка → Инструменты → Очистить кэш (Clear Cache).
Принцип работы: логика и детали
- Хук
header.first
Плагин работает на момент первого вызова заголовка (header.first). Это даёт максимальную гибкость в обработке параметров страницы до загрузки темы. - Определение текущей категории
- ЧПУ:
Извлекается сегмент URL (сразу после языка — /ru/user-guide/... даёт user-guide). - Старые ссылки:
Если передан параметр ?c — берётся код категории; если ?id — определяется категория страницы по БД.
Проверка принадлежности Используется функция:
pagemycatheader_is_descendant($cat, $parentcat)
- Она проверяет:
- Совпадает ли текущая категория с родительской;
- Является ли дочерней (на любом уровне вложенности).
Подмена шаблона
Для совпадающей категории формируется переменная Cotonti:
Cot::$env['location'] = 'page.' . $parentcat;
Далее Cotonti подгружает файл шаблона:
header.page.user-guide.tpl
- Все дочерние и родительская категория используют этот заголовок.
- Обратная совместимость При отсутствии ЧПУ, либо при старых типах адресов (
?c= или ?id=), логика плагина остаётся такой же — категория берётся из параметра или по ID из БД.
Пример структуры и работы
URL-примеры:
/ru/user-guide/projects-manual/tasks-general → шаблон: header.page.user-guide.tpl/index.php?c=projects-manual → проверяется дерево, подмена, если projects-manual является дочерней для user-guide/index.php?id=123 → определяется по ID категория, далее — по дереву
Итог:
Если страница относится к категории или подкатегории user-guide, плагин использует для неё заголовок header.page.user-guide.tpl.
Настройки
| Параметр | Тип | Описание |
| parentcat | string | Код родительской категории Page (например: user-guide) |
- Все подкатегории автоматически наследуют шаблон родителя.
- Для разных родительских категорий можно создавать отдельные шаблоны.
Возможные ошибки и решения
| Проблема | Причина | Решение |
| Не подключается кастомный header | Неправильный код категории, нет шаблона | Проверьте значение parentcat и наличие файла-шаблона |
| Не работает на подкатегориях | Порядок сегментов URL не тот, $_GET['c'] пуст (ЧПУ) | Плагин сам разбирает URL, не зависит от $_GET['c'] |
| Файл не найден | Перепутана директория или имя файла | Должен лежать строго: themes/ваша_тема/header.page.user-guide.tpl |
| После смены темы — дефолтный header | Файл шаблона остался в старой теме | Скопируйте шаблон для каждой новой темы |
| Не работает на корневой категории | Особенность URL-драйвера или отсутствие слеша | Исправлено — работает с любым вариантом |
| Кеш не сброшен | Изменения шаблона не применяются | Очистите кеш Cotonti через админку |
FAQ и рекомендации
- Можно ли работать с несколькими родительскими категориями одновременно?
— Нет, текущая версия работает только с одной категорией за установку. Для разных веток используйте отдельные шаблоны и перенастраивайте parentcat. - Вложенные категории
— Любая вложенность дерева поддерживается, поиск по цепочке родителей. - Права доступа
— Плагин влияет только на шаблон заголовка. Права доступа к категориям берутся из Cotonti. - Возвращение стандартного заголовка
— Если категория не соответствует настройке — будет использован стандартный header.tpl.
Ограничения
- Плагин работает только с модулем
page; - Не проверяет права доступа пользователя;
- Не обрабатывает другие модули (например, news, forums и т.д.);
- Одновременно использует только один шаблон по выбранной родительской категории.
Требования
- Cotonti Siena ≥0.9.26
- PHP ≥8.4
- Модули: page и structure (установлены и активны)
Структура файлов плагина
plugins/pagemycatheader/
├─ pagemycatheader.setup.php # Метаданные, регистрация и настройки
├─ pagemycatheader.functions.php # Базовые функции: проверка принадлежности к дереву категории
├─ pagemycatheader.header.first.php # Главная логика подключения, работа с URL и настройками
Лицензия
BSD License © 2025 webitproff
Автор, поддержка, обратная связь
Автор: webitproff
GitHub проекта: https://github.com/webitproff/cotonti-pagemycatheader
Вопросы, баги, предложения — issues на GitHub.
Полезные ссылки
Плагин помогает организовать гибкое визуальное оформление для рубрик и их содержимого без лишнего дублирования шаблонов!
Если вашей задаче нужен динамический заголовок пользователю для группы категорий — pagemycatheader именно для этого.
Если плагин оказался полезным — поставьте ⭐ на GitHub!
как это под капотом:
1. datas\config-sample.php
$cfg['enablecustomhf'] = true; // To enable header.$location.tpl and footer.$location.tpl
2. \system\header.php
...
$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)) ? ['header', $e] : ['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;
}
/* ===== */
...
3. \system\footer.php
...
$mtpl_type = (
defined('COT_ADMIN')
|| (
defined('COT_MESSAGE')
&& $_SESSION['s_run_admin']
&& cot_auth('admin', 'any', 'R')
)
) ? 'core' : 'module';
$mtpl_base = 'footer';
if (Cot::$cfg['enablecustomhf']) {
if (defined('COT_PLUG') && !empty($e)) {
$mtpl_base = ['footer', $e];
} elseif (!empty(Cot::$env['ext'])) {
$mtpl_base = ['footer', Cot::$env['ext']];
} elseif (!empty(Cot::$env['location'])) {
$mtpl_base = ['footer', Cot::$env['location']];
}
}
$t = new XTemplate(cot_tplfile($mtpl_base, $mtpl_type));
// @todo pass develop mode
$frontConfig = [
'config' => [
'serverEvents' => Cot::$cfg['serverEvents'] ?? ServerEventsDictionary::DRIVER_DISABLED,
],
'lang' => [],
];
/* === Hook === */
foreach (cot_getextplugins('footer.main') as $pl) {
include $pl;
}
/* ===== */
...
Авторские права
© webitproff, 27 Nov 2025, License BSD.
Вы можете нанять меня или предложить задание
напишите в личные сообщения на этой странице