Файл forums.posts.php в Cotonti. Часть 5
// Проверяем, разрешено ли пользователю отвечать на сообщение
// Это условие проверяет несколько параметров, в том числе настройки анти-бампинга, id пользователя, права на запись
$allowreplybox = !(
Cot::$cfg['forums']['antibumpforums'] // Если анти-бампинг для форума включен
&& $row['fp_posterid'] > 0 // Если id пользователя, который написал пост, больше 0
&& $row['fp_posterid'] == Cot::$usr['id'] // Если id пользователя совпадает с id текущего пользователя
&& Cot::$usr['auth_write'] // Если у текущего пользователя есть право на написание сообщений
);
// Далее идет проверка условий для отображения формы ответа на сообщение
if (
// Если либо включена форма для ответа, либо это последняя страница
(Cot::$cfg['forums']['enablereplyform'] || $lastpage)
// Если тема не закрыта (ft_state == 0)
&& !$rowt['ft_state']
// Если у пользователя есть id (он авторизован)
&& Cot::$usr['id'] > 0
// Если разрешено показывать форму ответа
&& $allowreplybox
// Если у пользователя есть право на написание сообщений
&& Cot::$usr['auth_write']
) {
// Инициализируем переменную для сообщения
$rmsg = null;
// Если задан параметр $quote (цитируемое сообщение)
if ($quote > 0) {
// Выполняем запрос к базе данных для получения информации о цитируемом сообщении
$sql_forums_quote = Cot::$db->query(
// Запрос на выборку из таблицы форумов
'SELECT fp_id, fp_text, fp_postername, fp_posterid, fp_creation FROM '
. Cot::$db->quoteTableName(Cot::$db->forum_posts) // Экранируем имя таблицы
. ' WHERE fp_topicid = ? AND fp_cat = ? AND fp_id = ? LIMIT 1', // Условия для выбора поста
[$q, $s, $quote] // Параметры для подстановки в запрос
);
Разбор кода:
-
Переменная
$allowreplybox: Это условие проверяет, разрешено ли пользователю оставлять ответ в теме. Проверяются следующие факторы:- Включен ли анти-бампинг на форуме (для защиты от многократных постов одного пользователя).
- Является ли пользователь автором сообщения и не имеет ли он права на повторный пост.
- Есть ли у пользователя права на создание сообщений (право на запись).
-
Условие для отображения формы ответа: Это условие проверяет несколько важных факторов для того, чтобы показать форму ответа:
- Включена ли форма ответа или это последняя страница форума.
- Не закрыта ли тема.
- Авторизован ли пользователь.
- Разрешено ли ему отвечать на сообщение в рамках анти-бампинга.
-
Переменная
$rmsg: Инициализируется как пустое значение, это может быть использовано позже для вывода сообщения. -
Условие
$quote > 0: Если параметр$quoteположителен (что означает, что пользователь цитирует другое сообщение), выполняется запрос к базе данных, чтобы получить информацию о цитируемом сообщении (текст сообщения, имя автора, id автора и дата создания). -
SQL запрос: Запрос извлекает данные из таблицы постов форума (предполагается, что это таблица
forum_posts), где id цитируемого сообщения совпадает с переданным параметром$quote, и проверяются другие параметры (например,$q— это id темы и$s— это id раздела).
Важные моменты:
- Cot::$cfg['forums']['antibumpforums'] и Cot::$cfg['forums']['enablereplyform']: Эти параметры из конфигурации указывают на то, включены ли настройки анти-бампинга и возможность отображения формы ответа на форуме.
- Cot::$usr['auth_write']: Проверяет, есть ли у текущего пользователя права на написание сообщений на форуме.
- Cot::$db->query(): Это стандартный способ выполнения SQL-запросов в Cotonti. В данном случае используется подготовленный запрос для получения данных из базы данных.
// Если запрос для получения цитируемого поста вернул результат
if ($row4 = $sql_forums_quote->fetch()) {
// Формируем текст сообщения для цитирования с помощью шаблона
$rmsg['fp_text'] = cot_rc(
'forums_code_quote', // Используем шаблон для отображения цитаты
[
// Составляем URL для цитируемого сообщения
'url' => cot_url(
'forums', // Формируем URL для форума
['m' => 'posts', 'q' => $q, 'd' => $durl], // Параметры для темы и страницы
'#' . $row4['fp_id'], // Ссылка на цитируемый пост
$forums_quote_htmlspecialchars_bypass ?? false // Определяем, нужно ли игнорировать htmlspecialchars (если задано)
),
// Уникальный идентификатор цитируемого поста
'id' => $row4['fp_id'],
// Дата создания цитируемого поста в формате datetime_medium
'date' => cot_date('datetime_medium', $row4['fp_creation']),
// Имя автора цитируемого поста
'postername' => $row4['fp_postername'],
// Текст цитируемого поста
'text' => $row4['fp_text'],
]
);
}
Разбор кода:
-
$sql_forums_quote->fetch():- Это метод запроса, который извлекает одну строку из результата запроса, выполненного ранее (в нашем случае, для получения цитируемого поста).
- Если данные были найдены, они присваиваются переменной
$row4.
-
Шаблон
cot_rc('forums_code_quote', ...):- Функция
cot_rc()используется для работы с шаблонами в Cotonti. В данном случае используется шаблонforums_code_quote, который предназначен для отображения цитируемого поста. - Внутри этого шаблона подставляются значения:
'url': Формируется URL для перехода к цитируемому посту. Включает параметрыm=posts(модуль постов),q=$q(id темы), иd=$durl(страница постов). Затем добавляется хэш-метка с id поста (#fp_id).'id': Идентификатор цитируемого поста.'date': Форматированная дата создания поста с помощью функцииcot_date('datetime_medium', ...).'postername': Имя автора поста.'text': Текст цитируемого сообщения.
- Функция
-
Использование
cot_url:- Функция
cot_url()генерирует URL, используя параметры, переданные в виде массива. Это удобно для формирования ссылок внутри форума, обеспечивая поддержку различных частей URL.
- Функция
-
Использование
cot_date('datetime_medium', ...):- Функция
cot_date()используется для форматирования даты. В данном случае используется форматdatetime_medium, что может означать стандартное отображение даты и времени (например, "22 января 2025, 14:30").
- Функция
-
$forums_quote_htmlspecialchars_bypass ?? false:- Этот оператор проверяет, существует ли переменная
$forums_quote_htmlspecialchars_bypass. Если она существует и не равнаnull, то ее значение будет использовано. В противном случае, будет использовано значениеfalse. Это позволяет контролировать, нужно ли пропускать обработкуhtmlspecialcharsдля цитируемого текста.
- Этот оператор проверяет, существует ли переменная
Важные моменты:
- Этот фрагмент кода отвечает за отображение цитируемого сообщения в формате, соответствующем шаблону форума. Основная задача — правильно сформировать ссылку на цитируемое сообщение, его текст, дату и автора.
- Использование
cot_rcпозволяет динамически подставлять значения в заранее подготовленный шаблон для цитирования. - Использование
cot_urlпомогает гибко строить ссылки в зависимости от параметров, заданных на странице.
// Проверка, если у постов форума есть дополнительные поля (extrafields)
if (!empty(Cot::$extrafields[Cot::$db->forum_posts])) {
// Перебор всех дополнительных полей
foreach (Cot::$extrafields[Cot::$db->forum_posts] as $extraField) {
// Переводим имя поля в верхний регистр, чтобы использовать в тегах
$uname = strtoupper($extraField['field_name']);
// Формируем значение для дополнительного поля с использованием функции cot_build_extrafields
$extraFieldValue = cot_build_extrafields('rmsg' . $extraField['field_name'], $extraField, null);
// Получаем название для дополнительного поля
$extraFieldTitle = cot_extrafield_title($extraField, 'forums_post_');
// Присваиваем значения в шаблон для дальнейшего использования
$t->assign([
// Присваиваем значение дополнительного поля в шаблон с уникальным тегом
'FORUMS_POSTS_NEWPOST_' . $uname => $extraFieldValue,
// Присваиваем заголовок дополнительного поля в шаблон с уникальным тегом
'FORUMS_POSTS_NEWPOST_' . $uname . '_TITLE' => $extraFieldTitle,
// Общие теги для дополнительного поля и его заголовка
'FORUMS_POSTS_NEWPOST_EXTRAFLD' => $extraFieldValue,
'FORUMS_POSTS_NEWPOST_EXTRAFLD_TITLE' => $extraFieldTitle,
]);
// Обрабатываем тег в шаблоне
$t->parse('MAIN.FORUMS_POSTS_NEWPOST.EXTRAFLD');
}
}
Разбор кода:
-
Проверка на наличие дополнительных полей у постов форума:
- В первой строке проверяется, существуют ли дополнительные поля для постов форума в глобальном массиве
Cot::$extrafieldsдля таблицыforum_posts. Если массив не пустой, то продолжаем работу с этими полями.
- В первой строке проверяется, существуют ли дополнительные поля для постов форума в глобальном массиве
-
Перебор всех дополнительных полей:
- Если дополнительные поля существуют, то начинается цикл
foreach, который перебирает все эти поля. Для каждого поля выполняются следующие действия.
- Если дополнительные поля существуют, то начинается цикл
-
Создание уникальных тегов:
- В переменную
$unameсохраняется имя поля, преобразованное в верхний регистр, чтобы использовать его в качестве уникального идентификатора для тегов.
- В переменную
-
Формирование значения для дополнительного поля:
- Используется функция
cot_build_extrafieldsдля формирования значения для этого поля. Она создает соответствующий HTML-код для отображения значения поля в форме.
- Используется функция
-
Получение заголовка для поля:
- Функция
cot_extrafield_titleиспользуется для получения заголовка дополнительного поля, который будет отображаться в интерфейсе пользователя.
- Функция
-
Присваивание значений в шаблон:
- В методе
assignшаблонизатораXTemplateприсваиваются несколько переменных:FORUMS_POSTS_NEWPOST_<FIELD_NAME>— значение дополнительного поля.FORUMS_POSTS_NEWPOST_<FIELD_NAME>_TITLE— заголовок для дополнительного поля.FORUMS_POSTS_NEWPOST_EXTRAFLDиFORUMS_POSTS_NEWPOST_EXTRAFLD_TITLE— общие теги для значения и заголовка.
- В методе
-
Обработка тега в шаблоне:
- После присваивания значений шаблонному тегу выполняется метод
parse, который обрабатывает тег и готовит его к дальнейшему выводу.
- После присваивания значений шаблонному тегу выполняется метод
Важные моменты:
- Этот фрагмент кода отвечает за обработку дополнительных полей для постов на форуме и отображение их в шаблоне.
- Дополнительные поля могут быть настроены администратором форума, и они позволяют добавлять произвольную информацию, которая будет выводиться вместе с основным содержанием поста.
- Использование шаблонных тегов позволяет гибко добавлять и отображать эти данные на странице форума.
// Инициализация переменной для текста
$text = '';
// Если в массиве $rmsg есть текст поста, сохраняем его в переменную $text
if (isset($rmsg['fp_text'])) {
$text = $rmsg['fp_text'];
}
// Присваивание значений в шаблон
$t->assign([
// Присваиваем URL для отправки нового поста
'FORUMS_POSTS_NEWPOST_SEND' => cot_url('forums', ['m' => 'posts', 'a' => 'newpost', 's' => $s, 'q' => $q]),
// Присваиваем текстовое поле для ввода нового поста
'FORUMS_POSTS_NEWPOST_TEXT' => Cot::$R['forums_code_newpost_mark'] .
cot_textarea(
'rmsgtext', // Имя поля
$text, // Текущий текст (или пустой)
16, // Высота текстового поля
56, // Ширина текстового поля
'', // Заголовок (пустое значение)
'input_textarea_' . ($minimaxieditor ?? '') // Класс для поля
),
// Присваиваем текст для отображения времени, через которое можно будет редактировать пост
'FORUMS_POSTS_NEWPOST_EDITTIMEOUT' => cot_build_timegap(0, Cot::$cfg['forums']['edittimeout'] * 3600),
]);
// Отображаем сообщения (если есть)
cot_display_messages($t);
// === Хук ===
foreach (cot_getextplugins('forums.posts.newpost.tags') as $pl) {
include $pl; // Включаем дополнительные плагины для новых постов
}
// =====
// Обрабатываем и парсим шаблон
$t->parse('MAIN.FORUMS_POSTS_NEWPOST');
Разбор кода:
-
Инициализация текста:
- Переменная
$textизначально пустая. Если в массиве$rmsgсуществует элемент с ключомfp_text, то он присваивается в переменную$text. Это нужно для предварительного заполнения поля текста, например, если редактируется уже существующий пост.
- Переменная
-
Присваивание данных в шаблон:
- Через метод
assignшаблонного движкаXTemplateприсваиваются несколько данных:FORUMS_POSTS_NEWPOST_SEND: URL для отправки нового поста. С помощью функцииcot_urlформируется путь к странице с параметрами, которые указывают на создание нового поста в форуме.FORUMS_POSTS_NEWPOST_TEXT: Вставляется HTML-форма для ввода текста нового поста. Используется функцияcot_textarea, которая генерирует HTML-код для текстового поля с определенными параметрами (высота, ширина и класс).FORUMS_POSTS_NEWPOST_EDITTIMEOUT: Формируется текст о времени, через которое можно редактировать пост. Время берется из конфигурации форума (Cot::$cfg['forums']['edittimeout']), умноженное на 3600 (для перевода часов в секунды). Функцияcot_build_timegapотображает разницу во времени.
- Через метод
-
Отображение сообщений:
- Функция
cot_display_messagesиспользуется для отображения сообщений (например, ошибок или успешных уведомлений) в шаблоне.
- Функция
-
Хук для плагинов:
- Вставляется хук для плагинов, который позволяет подключать внешние расширения или дополнительные теги для работы с постами на форуме. Все плагины, зарегистрированные для события
'forums.posts.newpost.tags', будут включены и выполнены.
- Вставляется хук для плагинов, который позволяет подключать внешние расширения или дополнительные теги для работы с постами на форуме. Все плагины, зарегистрированные для события
-
Парсинг шаблона:
- В конце выполняется метод
$t->parse('MAIN.FORUMS_POSTS_NEWPOST'), который парсит и генерирует итоговый HTML для блока с тегомFORUMS_POSTS_NEWPOST. Это нужно для отображения формы создания нового поста.
- В конце выполняется метод
Важные моменты:
- Этот код отвечает за создание формы для нового поста на форуме.
- Используется механизм плагинов (через хук), что позволяет легко расширять функциональность системы.
- Для отображения временных меток, таких как время редактирования, используется стандартная функция
cot_build_timegap, которая помогает представить это время в удобочитаемом виде.
// Если состояние темы заблокировано
} elseif ($rowt['ft_state']) {
// Присваиваем сообщение о том, что тема заблокирована
$t->assign('FORUMS_POSTS_TOPICLOCKED_BODY', Cot::$L['forums_topiclocked']);
// Парсим шаблон для отображения заблокированной темы
$t->parse('MAIN.FORUMS_POSTS_TOPICLOCKED');
// Если не разрешено отвечать на пост, но разрешено отображение формы для ответа
} elseif (!$allowreplybox && (Cot::$cfg['forums']['enablereplyform'] || $lastpage) && !$rowt['ft_state'] && Cot::$usr['id'] > 0) {
// Присваиваем сообщение о том, что ответ на тему заблокирован
$t->assign('FORUMS_POSTS_ANTIBUMP_BODY', Cot::$L['forums_antibump']);
// Парсим шаблон для отображения предупреждения о блокировке ответа
$t->parse('MAIN.FORUMS_POSTS_ANTIBUMP');
}
// Если тема имеет статус "private"
if ($rowt['ft_mode'] == 1) {
// Парсим шаблон для отображения приватной темы
$t->parse('MAIN.FORUMS_POSTS_TOPICPRIVATE');
}
Разбор:
-
Проверка заблокированной темы:
- Условие
elseif ($rowt['ft_state'])проверяет, заблокирована ли тема. В таблице форума, скорее всего, полеft_stateиспользуется для отображения состояния (например, 1 — заблокирована, 0 — активна). - Если тема заблокирована, то:
- В шаблон добавляется сообщение, что тема заблокирована (
Cot::$L['forums_topiclocked']— это локализованное сообщение). - Далее парсится блок шаблона
MAIN.FORUMS_POSTS_TOPICLOCKED, который отвечает за отображение этого состояния.
- В шаблон добавляется сообщение, что тема заблокирована (
- Условие
-
Проверка блокировки формы ответа:
- Условие
elseif (!$allowreplybox && (Cot::$cfg['forums']['enablereplyform'] || $lastpage) && !$rowt['ft_state'] && Cot::$usr['id'] > 0)проверяет несколько факторов:$allowreplyboxдолжно быть ложным, что означает, что форма ответа на пост не должна быть доступна.- Включена ли форма ответа на форуме (
Cot::$cfg['forums']['enablereplyform']) или на последней странице ($lastpage). - Тема не заблокирована (
!$rowt['ft_state']). - Пользователь должен быть авторизован (
Cot::$usr['id'] > 0).
- Если все условия выполняются, то:
- В шаблон добавляется сообщение о блокировке ответа на тему (
Cot::$L['forums_antibump']). - Парсится блок шаблона
MAIN.FORUMS_POSTS_ANTIBUMPдля отображения этого предупреждения.
- В шаблон добавляется сообщение о блокировке ответа на тему (
- Условие
-
Проверка приватной темы:
- Условие
if ($rowt['ft_mode'] == 1)проверяет, является ли тема приватной. Это полеft_modeв таблице форума, где, вероятно, 1 означает приватную тему. - Если тема приватная, то:
- Парсится блок шаблона
MAIN.FORUMS_POSTS_TOPICPRIVATE, который отображает информацию о приватной теме.
- Парсится блок шаблона
- Условие
Общее объяснение:
Этот код контролирует, что будет показано на странице обсуждения темы в зависимости от ее состояния:
- Если тема заблокирована, пользователю показывается соответствующее сообщение.
- Если ответы на тему запрещены (в том числе из-за анти-спам защиты), показывается сообщение о невозможности ответа.
- Если тема приватная, отображается информация о том, что доступ к теме ограничен.
Все эти блоки отображаются через шаблонные переменные, что позволяет гибко изменять визуальное оформление в зависимости от состояния темы.
// Если тема приватная (ft_mode == 1), добавляем префикс "# " к названию темы $rowt['ft_title'] = (($rowt['ft_mode'] == 1) ? '# ' : '') . $rowt['ft_title']; // Строим путь навигации для форума на основе категории форума $crumbs = cot_forums_buildpath($s); // Создаем хлебные крошки для верхнего пути навигации $toppath = cot_breadcrumbs($crumbs, Cot::$cfg['homebreadcrumb'], false); // Добавляем в хлебные крошки название текущей темы $crumbs[] = $rowt['ft_title']; // Создаем титульный путь навигации (включая название текущей темы) $toptitle = cot_breadcrumbs($crumbs, Cot::$cfg['homebreadcrumb'], true); // Если пользователь — администратор, добавляем специальный маркер для администратора $toptitle .= (Cot::$usr['isadmin']) ? Cot::$R['forums_code_admin_mark'] : '';
Разбор:
-
Префикс для приватной темы:
$rowt['ft_title'] = (($rowt['ft_mode'] == 1) ? '# ' : '') . $rowt['ft_title'];- Этот код проверяет, является ли тема приватной (
$rowt['ft_mode'] == 1). Если это так, то к заголовку темы добавляется префикс#. - В результате, если тема приватная, название будет начинаться с
#, что помогает визуально отличить приватные темы от обычных.
- Этот код проверяет, является ли тема приватной (
-
Путь навигации (хлебные крошки):
-
$crumbs = cot_forums_buildpath($s);- Функция
cot_forums_buildpath($s)создает массив "хлебных крошек", т.е. путь навигации от главной страницы форума до текущей категории форума. $s— это идентификатор категории форума, который передается в функцию.
- Функция
-
$toppath = cot_breadcrumbs($crumbs, Cot::$cfg['homebreadcrumb'], false);- Функция
cot_breadcrumbs()формирует строку HTML для хлебных крошек. В первом вызове она создает путь до текущей категории форума, но не включая название текущей темы (поэтому параметрfalse). Cot::$cfg['homebreadcrumb']— это строка или параметр, определяющий, как будет выглядеть главная страница в хлебных крошках.
- Функция
-
$crumbs[] = $rowt['ft_title'];- Здесь добавляется название текущей темы в массив крошек, так что в дальнейшем оно будет отображаться как последний элемент в пути.
-
$toptitle = cot_breadcrumbs($crumbs, Cot::$cfg['homebreadcrumb'], true);- Теперь вызывается
cot_breadcrumbsснова, но с параметромtrue, чтобы включить в хлебные крошки название темы ($rowt['ft_title']). - Это создает окончательный титульный путь, который включает в себя путь до форума и название текущей темы.
- Теперь вызывается
-
-
Маркер администратора:
$toptitle .= (Cot::$usr['isadmin']) ? Cot::$R['forums_code_admin_mark'] : '';- Здесь проверяется, является ли текущий пользователь администратором (
Cot::$usr['isadmin']). - Если пользователь — администратор, то к титульному пути добавляется специальный маркер (например, для пометки темы как администраторской). Этот маркер хранится в
Cot::$R['forums_code_admin_mark'].
- Здесь проверяется, является ли текущий пользователь администратором (
Общее объяснение:
Этот код отвечает за создание хлебных крошек для страницы форума, где:
- Если тема приватная, ее название будет отображаться с префиксом
#. - Хлебные крошки строятся от главной страницы форума до текущей категории и темы.
- Титульный путь (
$toptitle) включает в себя полный путь, включая название темы, а если пользователь является администратором, добавляется специальный маркер.
Это помогает пользователям легче ориентироваться в структуре форума и позволяет администратору отметить важные темы.
$t->assign([
// Присваиваем идентификатор форума
'FORUMS_POSTS_ID' => $q,
// Создаем ссылку на RSS для темы
'FORUMS_POSTS_RSS' => cot_url('rss', ['m' => 'topics', 'c' => $q]),
// Присваиваем хлебные крошки (путь навигации)
'FORUMS_POSTS_BREADCRUMBS' => $toptitle,
// Присваиваем заголовок темы, экранированный для безопасности
'FORUMS_POSTS_TITLE' => htmlspecialchars($rowt['ft_title']),
// Присваиваем описание темы, экранированное для безопасности
'FORUMS_POSTS_TOPICDESC' => htmlspecialchars($rowt['ft_desc']),
// Присваиваем название категории форума
'FORUMS_POSTS_CATTITLE' => htmlspecialchars(Cot::$structure['forums'][$s]['title']),
// Присваиваем путь навигации для категории форума
'FORUMS_POSTS_PATH' => $toppath,
// Генерируем выпадающий список для выбора категории форума
'FORUMS_POSTS_JUMPBOX' => cot_selectbox(
$s, // Значение по умолчанию (текущая категория)
'jumpbox', // Имя для селектора
array_keys($jumpbox), // Массив ключей категорий
array_values($jumpbox), // Массив значений категорий
false, // Не устанавливаем обязательное значение
'onchange="redirect(this)"' // JavaScript обработчик изменения значения
),
]);
Разбор:
-
Присваивание ID форума:
'FORUMS_POSTS_ID' => $q,- Здесь переменной
FORUMS_POSTS_IDприсваивается значение переменной$q, которая, скорее всего, представляет собой идентификатор текущей темы форума. Это значение используется для отображения или дальнейшей обработки.
- Здесь переменной
-
RSS ссылка для темы:
'FORUMS_POSTS_RSS' => cot_url('rss', ['m' => 'topics', 'c' => $q]),- Это генерирует URL для получения RSS-ленты по теме форума. Функция
cot_url()используется для создания ссылки на RSS, гдеm=topicsуказывает на раздел "темы", аc=$q— это идентификатор текущей темы.
- Это генерирует URL для получения RSS-ленты по теме форума. Функция
-
Хлебные крошки (breadcrumb):
'FORUMS_POSTS_BREADCRUMBS' => $toptitle,- Здесь в переменную
FORUMS_POSTS_BREADCRUMBSприсваивается титульный путь навигации$toptitle, который был создан ранее в коде. Это значение будет отображаться в виде хлебных крошек, показывающих путь до текущей темы.
- Здесь в переменную
-
Заголовок темы:
'FORUMS_POSTS_TITLE' => htmlspecialchars($rowt['ft_title']),- Заголовок текущей темы (из массива
$rowt) экранируется с помощью функцииhtmlspecialchars(), чтобы предотвратить возможные XSS-атаки. Это значение будет отображаться на странице как название темы.
- Заголовок текущей темы (из массива
-
Описание темы:
'FORUMS_POSTS_TOPICDESC' => htmlspecialchars($rowt['ft_desc']),- Аналогично заголовку, описание темы также экранируется для безопасности и присваивается переменной
FORUMS_POSTS_TOPICDESC.
- Аналогично заголовку, описание темы также экранируется для безопасности и присваивается переменной
-
Название категории форума:
'FORUMS_POSTS_CATTITLE' => htmlspecialchars(Cot::$structure['forums'][$s]['title']),- Это присваивает название категории форума, в которой находится текущая тема. Значение берется из глобальной переменной
Cot::$structure['forums']на основе идентификатора категории$s. Название категории также экранируется для безопасности.
- Это присваивает название категории форума, в которой находится текущая тема. Значение берется из глобальной переменной
-
Путь навигации:
'FORUMS_POSTS_PATH' => $toppath,- Это присваивает переменной
FORUMS_POSTS_PATHранее созданный путь навигации$toppath, который будет отображать путь от главной страницы форума до текущей категории и темы.
- Это присваивает переменной
-
Выпадающий список (jumpbox):
'FORUMS_POSTS_JUMPBOX' => cot_selectbox(...),- Это генерирует выпадающий список (селектор) для выбора другой категории форума. Функция
cot_selectbox()создает HTML для выпадающего списка, где:$s— это текущая категория, которая будет выбрана по умолчанию.array_keys($jumpbox)— это список всех доступных категорий, которые будут отображаться в выпадающем списке.array_values($jumpbox)— это значения категорий, которые будут использованы для создания ссылок.- Параметр
'onchange="redirect(this)"'добавляет обработчик на изменение значения в селекторе, чтобы при выборе категории происходил редирект на соответствующую страницу форума.
- Это генерирует выпадающий список (селектор) для выбора другой категории форума. Функция
Общее объяснение:
Этот код подготавливает данные, которые будут переданы в шаблон для отображения. В частности, он:
- Присваивает значения для различных переменных шаблона, таких как идентификатор темы, заголовок, описание, путь навигации и ссылки на RSS.
- Создает хлебные крошки, выпадающий список для выбора категории форума и другие элементы интерфейса.
- Для всех строк, которые могут содержать HTML, применяется экранирование через
htmlspecialchars()для предотвращения атак типа XSS.
Этот фрагмент кода генерирует нужную информацию для отображения на странице форума, включая настройки для пользователя и интерфейса.
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-07-05 18:32
- Page published: 2025-02-20 16:24
- Last update: 2025-02-20 16:24