// Назначаем теги пагинации для шаблона
$t->assign(cot_generatePaginationTags($pagenav));
// Иконка темы
$rowt['ft_icon'] = 'posts'; // Устанавливаем базовую иконку для темы как 'posts'.
$rowt['ft_postisnew'] = FALSE; // Флаг, указывающий, что тема не новая
// Проверка, обновлялась ли тема после последнего визита пользователя
if ($rowt['ft_updated'] > Cot::$usr['lastvisit'] && Cot::$usr['id'] > 0) {
$rowt['ft_icon'] .= '_new'; // Если тема обновлена после визита, добавляем к иконке '_new'.
$rowt['ft_postisnew'] = TRUE; // Отмечаем, что тема новая
}
// Проверка на горячую тему
if ($rowt['ft_postcount'] >= Cot::$cfg['forums']['hottopictrigger'] && !$rowt['ft_state'] && !$rowt['ft_sticky']) {
$rowt['ft_icon'] = ($rowt['ft_postisnew']) ? 'posts_new_hot' : 'posts_hot'; // Если количество сообщений больше порога, устанавливаем иконку горячей темы.
} else {
$rowt['ft_icon'] .= ($rowt['ft_sticky']) ? '_sticky' : ''; // Если тема закреплена, добавляем '_sticky' к иконке.
$rowt['ft_icon'] .= ($rowt['ft_state']) ? '_locked' : ''; // Если тема заблокирована, добавляем '_locked' к иконке.
}
// Сохраняем тип иконки для дальнейшего использования
$rowt['ft_icon_type'] = $rowt['ft_icon'];
$rowt['ft_icon'] = cot_rc('forums_icon_topic', array('icon' => $rowt['ft_icon'])); // Генерируем окончательную иконку через шаблонный тег.
// Определение расширенной иконки для пользователя, если он является первым постером
$rowt['ft_icon_type_ex'] = $rowt['ft_icon_type'];
if (Cot::$usr['id'] > 0 && $rowt['ft_firstposterid'] == Cot::$usr['id']) {
$rowt['ft_icon_type_ex'] .= '_posted'; // Если текущий пользователь является первым постером, добавляем '_posted'.
}
// Передаем иконки в шаблон
$t->assign([
'FORUMS_POSTS_ICON' => $rowt['ft_icon'],
'FORUMS_POSTS_ICON_TYPE' => $rowt['ft_icon_type'],
'FORUMS_POSTS_ICON_TYPE_EX' => $rowt['ft_icon_type_ex'],
]);
Разбор кода:
-
Пагинация: В первую очередь вызывается функция
cot_generatePaginationTags($pagenav), которая генерирует теги для пагинации, и эти теги присваиваются переменной$t. Это позволяет отображать пагинацию на страницах форума. -
Иконка темы:
- Изначально задается базовая иконка темы как
posts. - Флаг
ft_postisnewиспользуется для того, чтобы отметить, что тема новая (если она была обновлена после последнего визита пользователя). - Если тема имеет больше сообщений, чем установленный порог (
hottopictrigger), и не является заблокированной или закрепленной, то она считается "горячей". В противном случае иконка будет дополнена в зависимости от того, закреплена ли тема или заблокирована.
- Изначально задается базовая иконка темы как
-
Тип иконки:
- После определения иконки для темы, её тип сохраняется в переменной
ft_icon_type. Иконка генерируется с помощью функцииcot_rc, которая позволяет работать с шаблонами и заменять параметры внутри строк.
- После определения иконки для темы, её тип сохраняется в переменной
-
Расширенная иконка:
- Если текущий пользователь является первым постером темы, то иконка для него будет дополнена суффиксом
_posted, чтобы обозначить его вклад в тему.
- Если текущий пользователь является первым постером темы, то иконка для него будет дополнена суффиксом
-
Назначение значений в шаблон:
- В конце иконки передаются в шаблон через
t->assign(), чтобы они могли быть использованы в представлении страницы форума.
- В конце иконки передаются в шаблон через
// Проверяем, есть ли дополнительные поля для темы форума
if (!empty(Cot::$extrafields[Cot::$db->forum_topics])) {
// Перебираем все дополнительные поля для темы форума
foreach (Cot::$extrafields[Cot::$db->forum_topics] as $exfld) {
$tag = mb_strtoupper($exfld['field_name']); // Преобразуем имя поля в верхний регистр для использования в теге.
$exfld_title = cot_extrafield_title($exfld, 'forums_topic_'); // Получаем заголовок для поля с использованием функции cot_extrafield_title.
// Передаем в шаблон данные о дополнительном поле
$t->assign([
'FORUMS_POSTS_TOPIC_' . $tag . '_TITLE' => $exfld_title, // Заголовок дополнительного поля
'FORUMS_POSTS_TOPIC_' . $tag => cot_build_extrafields_data('forums', $exfld, $rowt['ft_' . $exfld['field_name']],
(Cot::$cfg['forums']['markup'] && Cot::$cfg['forums']['cat_' . $s]['allowbbcodes'])), // Значение поля, с учетом разрешения BB-кодов.
'FORUMS_POSTS_TOPIC_' . $tag . '_VALUE' => $rowt['ft_' . $exfld['field_name']], // Значение поля
]);
}
}
Разбор кода:
-
Проверка дополнительных полей:
- Сначала проверяется, есть ли у темы форума дополнительные поля, используя условие
!empty(Cot::$extrafields[Cot::$db->forum_topics]). Это массив дополнительных полей для темы форума.
- Сначала проверяется, есть ли у темы форума дополнительные поля, используя условие
-
Обработка каждого дополнительного поля:
- В цикле
foreachперебираются все дополнительные поля. Для каждого поля:mb_strtoupper($exfld['field_name'])— преобразует имя поля в верхний регистр для использования в теге шаблона.cot_extrafield_title($exfld, 'forums_topic_')— вызывает функцию, которая возвращает заголовок для данного дополнительного поля с префиксом 'forums_topic_'.
- В цикле
-
Передача данных в шаблон:
- Для каждого поля создаются теги, которые передаются в шаблон с помощью
$t->assign(). Теги содержат:- Заголовок поля (
FORUMS_POSTS_TOPIC_..._TITLE). - Значение поля (
FORUMS_POSTS_TOPIC_...), которое формируется через функциюcot_build_extrafields_data(). Эта функция также проверяет, разрешены ли BB-коды для данного поля. - Оригинальное значение поля из базы данных (
FORUMS_POSTS_TOPIC_..._VALUE).
- Заголовок поля (
- Для каждого поля создаются теги, которые передаются в шаблон с помощью
/* === Hook === */
foreach (cot_getextplugins('forums.posts.tags') as $pl) {
include $pl; // Включаем расширения (плагины), если они существуют для форума в разделе 'forums.posts.tags'.
}
/* ===== */
// Парсим основной шаблон и выводим его
$t->parse('MAIN'); // Парсит (генерирует) шаблон 'MAIN'.
$t->out('MAIN'); // Выводит результат шаблона 'MAIN' на экран.
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключаем файл footer.php, который обычно завершает страницу (например, для вывода футера).
// Кеширование данных
if (Cot::$cache && Cot::$usr['id'] === 0 && Cot::$cfg['cache_forums']) {
Cot::$cache->static->write(); // Если кеширование включено, пользователь не авторизован, и кэш для форумов включен, то сохраняем кэш статической страницы.
}
Разбор кода:
-
Работа с плагинами:
cot_getextplugins('forums.posts.tags')— функция, которая получает список плагинов, зарегистрированных для хукаforums.posts.tags.- В цикле
foreachэти плагины подключаются с помощьюinclude $pl. Это позволяет подключить внешние расширения, которые могут изменять поведение или внешний вид страницы форума.
-
Парсинг и вывод шаблона:
$t->parse('MAIN')— эта строка парсит (обрабатывает) шаблон, создавая HTML-контент, который соответствует шаблону с меткойMAIN.$t->out('MAIN')— выводит результат шаблона на страницу. Этот метод фактически отображает сгенерированное содержимое шаблона пользователю.
-
Подключение футера:
require_once Cot::$cfg['system_dir'] . '/footer.php';— подключает файл футера. Обычно это файл, который завершает страницу, добавляя стандартный футер (например, информацию о копирайте или другие элементы внизу страницы).
-
Кеширование:
- Включена проверка, чтобы данные кешировались только в случае, если:
- Включено кеширование в системе (
Cot::$cache). - Пользователь не авторизован (
Cot::$usr['id'] === 0). - Кеширование для форума включено в настройках (
Cot::$cfg['cache_forums']).
- Включено кеширование в системе (
- Если все условия выполнены, данные сохраняются в кеш с помощью
Cot::$cache->static->write(). Это помогает ускорить загрузку страницы, так как статическая информация будет храниться в кеше и использоваться для последующих запросов.
- Включена проверка, чтобы данные кешировались только в случае, если: