описание файла page.header.php в Cotonti CMF
1. Основное назначение и место в системе Cotonti
Файл page.header.php отвечает за вывод уведомлений в заголовке сайта для пользователей, которые имеют права на управление страницами (администраторы и редакторы). Он формирует массив уведомлений о новых страницах, ожидающих модерации, и черновиках, находящихся в работе.
Расположение в системе Cotonti:
Обычно этот файл находится в директории:
/modules/page/page.header.php
Он является частью модуля "Pages" (страницы), который управляет публикацией и отображением контента на сайте.
2. Взаимодействие с другими частями системы
-
Хуки:
Файл подключается через хук header.main, что позволяет выполнять его код при формировании заголовка страницы. Это значит, что уведомления будут видны на всех страницах сайта, где вызывается данный хук (например, в административной панели или личном кабинете пользователя).
-
База данных:
Файл выполняет SQL-запросы к таблице pages для подсчета количества страниц, находящихся в очереди на модерацию или в черновиках.
-
Модули и функции Cotonti:
Используется подключение стандартного модуля page для работы с контентом.
-
Глобальные переменные:
Работает с глобальными объектами Cotonti (Cot::$usr, Cot::$db, Cot::$sys, Cot::$out), которые хранят информацию о текущем пользователе, системе и данных для вывода.
3. Переменные, хуки, методы, функции и классы
Хуки:
header.main — основной хук, который инициирует выполнение кода при рендеринге заголовка сайта.
Классы и пространства имен:
Cot — глобальный статический класс Cotonti, через который осуществляется доступ к системным объектам:
Cot::$usr — данные текущего пользователя (ID, права и т.д.).
Cot::$db — объект базы данных для выполнения SQL-запросов.
Cot::$sys — системные переменные, используемые для хранения состояния и промежуточных данных.
Cot::$out — массив для формирования данных, которые будут выведены на странице.
Функции и методы:
-
cot_auth($area, $option, $right)
Проверяет, имеет ли пользователь права на выполнение определённых действий в указанной области (например, модуле страниц).
-
cot_incfile($module, $type)
Подключает файл модуля для использования его функциональности.
-
cot_url($target, $params)
Генерирует URL для перехода на нужные страницы сайта с заданными параметрами.
-
cot_declension($number, $titles)
Возвращает корректную форму слова в зависимости от числа (например, "1 черновик", "2 черновика", "5 черновиков").
-
query() (метод объекта базы данных)
Выполняет SQL-запрос.
-
fetchColumn() (метод объекта базы данных)
Извлекает одно значение из результата SQL-запроса (например, количество записей).
Переменные:
Cot::$usr['id'] — ID текущего пользователя. Проверяется для определения, авторизован ли пользователь.
Cot::$sys['pagesqueued'] — количество страниц в очереди на модерацию.
Cot::$sys['pagesindrafts'] — количество страниц в черновиках.
Cot::$out['notices_array'] — массив уведомлений, который будет выведен в интерфейсе пользователя.
$Ls — массив языковых строк для локализации уведомлений.
4. Суть кода: задачи, функции и условия
-
Проверка авторизации пользователя:
Сначала проверяется, авторизован ли пользователь и есть ли у него права на управление страницами.
- Если пользователь — администратор (
A), он видит уведомления о всех страницах, ожидающих модерации и черновиках.
- Если пользователь — редактор (
W), он видит уведомления только о своих страницах.
-
Подключение модуля страниц:
Для работы с базой данных подключается модуль page.
-
Получение данных из базы:
Выполняются SQL-запросы для подсчета:
- Страниц в очереди на модерацию (
page_state = 1).
- Страниц в черновиках (
page_state = 2).
-
Формирование уведомлений:
Если есть страницы, ожидающие проверки или сохранённые как черновики, добавляются уведомления с количеством и ссылками для перехода в соответствующие разделы.
5. Как использовать этот файл владельцу сайта
-
Для администраторов:
Файл помогает отслеживать новые материалы, требующие модерации. Это упрощает управление контентом, так как уведомления видны сразу в панели управления.
-
Для редакторов:
Позволяет быстро видеть статус своих материалов — сколько страниц ещё не опубликовано или сохранено как черновики.
-
Для кастомизации:
Владелец сайта может изменить логику отображения уведомлений:
- Добавить новые условия для уведомлений.
- Изменить SQL-запросы для работы с другими типами контента.
- Внести изменения в отображение уведомлений (например, добавить приоритеты или цвета для разных типов уведомлений).
6. Стиль написания PHP-кода и совместимость
-
Стиль кода:
- Используется объектно-ориентированный подход (OOP) с глобальными статическими объектами (
Cot::$usr, Cot::$db и т.д.).
- Активно применяются строгие проверки авторизации и прав доступа.
- Чистый и читаемый код с логическими блоками, разделёнными условиями
if и elseif.
- SQL-запросы выполняются с использованием встроенных методов для работы с БД.
-
Совместимость с PHP:
- Код совместим с версиями PHP 5.4 и выше, так как использует стандартные функции Cotonti и базовые возможности PHP (например, пространство имён
Cot::).
- Рекомендуемая версия — PHP 7.4+ для лучшей производительности и безопасности.
- Нет использования функций, специфичных для новых версий PHP 8.x, что делает код кросс-версией.
Заключение
Файл page.header.php — это важный элемент модуля "Pages" в Cotonti CMF, который отвечает за уведомления о статусе страниц для администраторов и редакторов. Он эффективно взаимодействует с системой авторизации, базой данных и пользовательским интерфейсом. Код написан с акцентом на безопасность и читаемость, что упрощает его модификацию для владельцев сайтов.
<?php
/* ====================
[BEGIN_COT_EXT] // Начало блока метаинформации расширения Cotonti.
Hooks=header.main // Указывает, что данный код подключается к хуку 'header.main', т.е. выполняется при формировании заголовка страницы.
[END_COT_EXT] // Конец блока метаинформации расширения.
==================== */
/**
* Header notices for new pages
*
* @package Cotonti // Указывает, что данный файл относится к пакету Cotonti.
* @copyright (c) Cotonti Team // Авторские права принадлежат команде Cotonti.
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt // Ссылка на лицензию проекта Cotonti.
*/
defined('COT_CODE') or die('Wrong URL'); // Проверка, определена ли константа COT_CODE. Если нет — скрипт завершает выполнение для защиты от прямого доступа.
if (
Cot::$usr['id'] > 0 // Проверка, авторизован ли пользователь (ID больше 0).
&& (cot_auth('page', 'any', 'A') || cot_auth('page', 'any', 'W')) // Проверка, есть ли у пользователя права администратора (A) или права на запись (W) для модуля страниц.
) {
require_once cot_incfile('page', 'module'); // Подключение основного файла модуля страниц для дальнейшего использования его функциональности.
}
if (Cot::$usr['id'] > 0 && cot_auth('page', 'any', 'A')) { // Проверка: авторизован ли пользователь и имеет ли он права администратора на модуль страниц.
Cot::$sys['pagesqueued'] = (int) Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages .
' WHERE page_state = 1')->fetchColumn(); // Подсчет количества страниц в очереди на модерацию (page_state = 1).
if (Cot::$sys['pagesqueued'] > 0) { // Если есть хотя бы одна страница в очереди на модерацию.
Cot::$out['notices_array'][] = array( // Добавление уведомления в массив уведомлений для отображения в интерфейсе.
cot_url('admin', 'm=page'), // Ссылка на административную панель модуля страниц.
cot_declension(Cot::$sys['pagesqueued'], $Ls['unvalidated_pages']) // Формирование текста уведомления с правильным склонением в зависимости от количества страниц.
);
}
Cot::$sys['pagesindrafts'] = (int) Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages
." WHERE page_state = 2")->fetchColumn(); // Подсчет количества страниц в черновиках (page_state = 2).
if (Cot::$sys['pagesindrafts'] > 0) { // Если есть хотя бы одна страница в черновиках.
Cot::$out['notices_array'][] = array( // Добавление уведомления о черновиках в массив уведомлений.
cot_url('admin', 'm=page&filter=drafts'), // Ссылка на административную панель с фильтром для отображения черновиков.
cot_declension(Cot::$sys['pagesindrafts'], $Ls['pages_in_drafts']) // Формирование текста уведомления с учетом правильного склонения.
);
}
} elseif (Cot::$usr['id'] > 0 && cot_auth('page', 'any', 'W')) { // Альтернативная проверка: если пользователь авторизован и имеет права на запись (но не администратор).
Cot::$sys['pagesqueued'] = (int) Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages .
' WHERE page_state=1 AND page_ownerid = ' . Cot::$usr['id'])->fetchColumn(); // Подсчет количества страниц в очереди на модерацию, принадлежащих текущему пользователю.
if (Cot::$sys['pagesqueued'] > 0) { // Если у пользователя есть страницы, ожидающие модерации.
Cot::$out['notices_array'][] = array( // Добавление уведомления в интерфейс пользователя.
cot_url('page', 'c=unvalidated'), // Ссылка на список необработанных страниц для данного пользователя.
cot_declension(Cot::$sys['pagesqueued'], $Ls['unvalidated_pages']) // Формирование текста уведомления с правильным склонением.
);
}
Cot::$sys['pagesindrafts'] = (int) Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages .
" WHERE page_state=2 AND page_ownerid = " . Cot::$usr['id'])->fetchColumn(); // Подсчет количества черновиков, принадлежащих текущему пользователю.
if (Cot::$sys['pagesindrafts'] > 0) { // Если у пользователя есть черновики.
Cot::$out['notices_array'][] = array( // Добавление уведомления о черновиках.
cot_url('page', 'c=saved_drafts'), // Ссылка на список черновиков для текущего пользователя.
cot_declension(Cot::$sys['pagesindrafts'], $Ls['pages_in_drafts'])); // Формирование текста уведомления с правильным склонением.
}
}