Файл forums.newtopic.php в Cotonti

управляет интерфейсом, который пользователи видят при создании новой темы на форуме, заполняя поля формы

Опубликовано в: Модуль Forums в Cotonti CMF

Описание файла "forums.newtopic.php" в Cotonti

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

Место в системе Cotonti:
Этот файл находится в каталоге /modules/forums/inc/, который является частью модуля forums. Модуль forums отвечает за работу форума на сайте. Конкретно, файл forums.newtopic.php обрабатывает создание новых тем на форуме.

Взаимодействие внутри сайта

Файл "forums.newtopic.php" работает как часть бизнес-логики создания темы на форуме. При обращении к странице создания темы, этот файл:

  1. Загружает необходимые данные (например, параметры категории форума).
  2. Выполняет валидацию данных, введённых пользователем (например, заголовка и содержания темы).
  3. Взаимодействует с базой данных для создания новой записи в таблице форумов (темы и сообщения).
  4. Обрабатывает дополнительные поля (экстра-поля), которые могут быть добавлены к темам или сообщениям.
  5. Подключает внешние плагины для обработки данных, если они предусмотрены системой.
  6. Подготавливает вывод в шаблон, который отображается пользователю.

Кроме того, файл использует хуки для расширения функциональности через сторонние плагины и встраивает их в процесс создания темы.

Переменные, хуки, методы, функции, классы, используемые в коде:

  1. Переменные:

    • $s: Категория форума, в которой создаётся новая тема.
    • $rtopic: Массив, содержащий данные о теме (заголовок, описание, режим приватности и др.).
    • $rmsg: Массив, содержащий данные сообщения (текст, идентификатор автора и др.).
    • $t: Экземпляр класса XTemplate, используется для работы с шаблонами и отображения HTML.
    • $q: Идентификатор новой темы в базе данных.
    • $p: Идентификатор нового сообщения в базе данных.
  2. Хуки:

    • 'forums.newtopic.first' — выполняется в начале обработки запроса для создания темы, позволяет подключать плагины до выполнения основной логики.
    • 'forums.newtopic.rights' — используется для проверки прав пользователя перед созданием темы.
    • 'forums.newtopic.newtopic.first' — выполняется перед обработкой данных формы для новой темы.
    • 'forums.newtopic.newtopic.done' — выполняется после успешного создания темы и сообщения.
    • 'forums.newtopic.tags' — используется для работы с тегами новой темы.
    • 'forums.newtopic.main' — выполняется при формировании основного шаблона страницы создания темы.
  3. Методы/Функции:

    • cot_import(): Загружает и фильтрует входные данные из запроса.
    • cot_auth(): Проверяет права пользователя для работы с форумом.
    • cot_blockguests(): Блокирует доступ для гостей, если доступ ограничен.
    • cot_die(): Прерывает выполнение и выводит сообщение об ошибке, если возникли проблемы.
    • cot_error(): Отображает ошибки валидации данных, например, если длина заголовка слишком короткая.
    • cot_db->insert(): Вставляет данные в базу данных.
    • cot_forums_prunetopics(): Очищает старые темы, если это настроено.
    • cot_extrafield_movefiles(): Обрабатывает перемещение файлов, если они связаны с экстра-полями.
    • cot_forums_updateUserPostCount(): Обновляет счётчик сообщений пользователя после создания новой темы.
    • cot_forums_updateStructureCounters(): Обновляет счетчики структуры форума после добавления новой темы.
    • cot_shield_protect(): Защищает от CSRF-атак.
    • cot_shield_update(): Обновляет информацию о защите от CSRF.
    • cot_redirect(): Перенаправляет пользователя на другую страницу.
    • cot_display_messages(): Отображает сообщения об ошибках или успехах.
    • cot_tplfile(): Загружает путь к шаблону для отображения.
    • cot_breadcrumbs(): Формирует хлебные крошки для навигации по сайту.
    • cot_parse_autourls(): Преобразует текст в URL-формат.
  4. Классы:

    • XTemplate: Используется для обработки шаблонов и вывода HTML. Шаблон с расширением forums.newtopic используется для отображения формы создания новой темы.

Задачи, функции и условия кода:

  1. Проверка прав пользователя:
    Файл проверяет, имеет ли пользователь достаточные права для создания новой темы (права чтения и записи). Это делается с помощью функции cot_auth() и проверки настроек форума для категории.

  2. Обработка формы:
    После отправки формы с данными о новой теме, файл выполняет проверку на наличие ошибок (например, длина заголовка или сообщения слишком короткая). Для этого используются функции cot_error() и cot_die().

  3. Создание новой темы и сообщения:
    Если все данные верны, файл создает запись для новой темы в базе данных (с помощью метода insert()), а затем создает сообщение, связанное с этой темой.

  4. Обработка экстра-полей:
    Файл проверяет наличие экстра-полей для темы и сообщений (если таковые есть), а затем собирает и сохраняет их в базу данных.

  5. Уведомления и переадресация:
    После создания темы и сообщения, пользователю показывается уведомление о результате операции, и он перенаправляется на страницу темы.

  6. Интеграция с плагинами:
    Код поддерживает хуки, которые позволяют подключать сторонние плагины для расширения функциональности создания темы, например, для обработки тегов или добавления дополнительных данных.

  7. Подготовка страницы:
    В файле генерируется HTML для страницы создания темы, включая хлебные крошки, форму с полями для ввода и настройки, а также любые дополнительные элементы, такие как флажок приватности или экстра-поля.

 

<?php

/**
 * Forums posts display.
 *
 * @package Forums
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */

 // Проверка, что код был вызван через движок Cotonti, если нет - выполнение останавливается.
defined('COT_CODE') or die('Wrong URL'); 

// Импортирует значение из глобального массива GET с параметром 's', ожидая строковый тип данных (TXT). Это значение будет использоваться для указания категории раздела форума.
$s = cot_import('s','G','TXT'); 

// Блокирует доступ для гостей, если пользователь не авторизован, выполнение скрипта прекращается.
cot_blockguests(); 

// Если параметр $s пуст, выполнение останавливается с ошибкой, так как категория форума обязана быть задана.
cot_die(empty($s)); 

/* === Hook === */
// Ищет и подключает плагины, зарегистрированные на хук 'forums.newtopic.first'.
foreach (cot_getextplugins('forums.newtopic.first') as $pl) { 
	// Подключает найденный плагин.
	include $pl; 
}
/* ===== */

// Проверка, существует ли структура форума для указанной категории $s. Если нет - выполнение останавливается с ошибкой.
isset(Cot::$structure['forums'][$s]) || cot_die(); 

 

// Получает права пользователя для чтения, записи и администраторские права в контексте форума и категории $s.
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('forums', $s); 

/* === Hook === */
// Ищет и подключает плагины, зарегистрированные на хук 'forums.newtopic.rights'.
foreach (cot_getextplugins('forums.newtopic.rights') as $pl) { 
	// Подключает найденный плагин.
	include $pl; 
}
/* ===== */

// Блокирует доступ для пользователя, если у него нет прав на запись на форуме.
cot_block(Cot::$usr['auth_write']); 

// Если категория форума заблокирована, выполнение останавливается с ошибкой 602 (форум заблокирован).
if (Cot::$structure['forums'][$s]['locked']) { 
	// Сообщение об ошибке и завершение работы скрипта.
	cot_die_message(602, true); 
}

// Инициализация массива для темы форума с пустыми значениями.
$rtopic = [
    'ft_title' => '',  // Заголовок темы (пустой по умолчанию).
    'ft_desc' => '',   // Описание темы (пустое по умолчанию).
    'ft_mode' => '',   // Режим темы (пустой по умолчанию).
];

// Инициализация массива для сообщения с пустыми значениями.
$rmsg = [
    'fp_text' => '',   // Текст сообщения (пустой по умолчанию).
];

 

// Если действие запроса равно 'newtopic', то выполняется создание новой темы.
if ($a == 'newtopic') { 
	// Защищает от CSRF атак, проверяя подлинность запроса.
	cot_shield_protect(); 

	/* === Hook === */
	// Ищет и подключает плагины, зарегистрированные на хук 'forums.newtopic.newtopic.first'.
	foreach (cot_getextplugins('forums.newtopic.newtopic.first') as $pl) { 
		// Подключает найденный плагин.
		include $pl; 
	}
	/* ===== */

	// Импортирует текст сообщения, отправленный через POST-запрос, в формате HTML.
	$rmsg['fp_text'] = cot_import('rmsgtext','P','HTM'); 

	// Импортирует заголовок темы, отправленный через POST-запрос, с ограничением по длине 255 символов.
	$rtopic['ft_title'] = cot_import('rtopictitle','P','TXT', 255); 

	// Импортирует описание темы, отправленное через POST-запрос, с ограничением по длине 255 символов.
	$rtopic['ft_desc'] = cot_import('rtopicdesc','P','TXT', 255); 

	// Определяет, будет ли тема приватной, основываясь на значении 'rtopicmode' и настройках категории форума.
	$rtopic['ft_mode'] = (int) (cot_import('rtopicmode','P','BOL') && Cot::$cfg['forums']['cat_' . $s]['allowprvtopics']) ? 1 : 0;

    // Если текст сообщения не пуст, создается превью темы (первые 120 символов текста).
    $rtopic['ft_preview'] = !empty($rmsg['fp_text']) ? cot_string_truncate($rmsg['fp_text'], 120) : ''; 

    // Если превью все еще слишком длинное, убираются HTML-теги и снова обрезается строка.
    if (mb_strlen($rtopic['ft_preview']) > 128) { 
        // Убирает теги HTML и обрезает строку до 120 символов.
        $rtopic['ft_preview'] = cot_string_truncate(strip_tags($rmsg['fp_text']), 120, false); 
    }

 

// Проверяет, что длина заголовка темы больше минимальной длины, установленной в конфигурации форума.
if (mb_strlen($rtopic['ft_title']) < Cot::$cfg['forums']['mintitlelength']) { 
	// Если заголовок слишком короткий, генерируется ошибка с кодом 'forums_titletooshort' и полем 'rtopictitle'.
	cot_error('forums_titletooshort', 'rtopictitle'); 
} 

// Проверяет, что длина сообщения больше минимальной длины, установленной в конфигурации форума.
if (mb_strlen($rmsg['fp_text']) < Cot::$cfg['forums']['minpostlength']) { 
	// Если сообщение слишком короткое, генерируется ошибка с кодом 'forums_messagetooshort' и полем 'rmsgtext'.
	cot_error('forums_messagetooshort', 'rmsgtext'); 
} 

// Проверяет, что путь категории форума не является корневым (не содержит точку).
if (!strpos(Cot::$structure['forums'][$s]['path'], '.')) { 
	// Если пытаются создать тему в корневой категории, выводится сообщение об ошибке.
	include cot_langfile('message', 'core'); 
	// Отображается текст ошибки из сообщения 602.
	cot_error(Cot::$L['msg602_body']); 
}

// Проверяет, есть ли дополнительные поля для таблицы форумов (темы).
if (!empty(Cot::$extrafields[Cot::$db->forum_topics])) { 
	// Если дополнительные поля есть, они обрабатываются и добавляются в массив темы.
	foreach (Cot::$extrafields[Cot::$db->forum_topics] as $exfld) { 
		// Импортирует значения для каждого дополнительного поля, основываясь на его параметрах.
		$rtopic['ft_' . $exfld['field_name']] = cot_import_extrafields('rtopic' . $exfld['field_name'], $exfld, 'P', '', 'forums_topic_'); 
	} 
}

// Проверяет, есть ли дополнительные поля для таблицы сообщений форума.
if (!empty(Cot::$extrafields[Cot::$db->forum_posts])) { 
	// Если дополнительные поля есть, они обрабатываются и добавляются в массив сообщения.
	foreach (Cot::$extrafields[Cot::$db->forum_posts] as $exfld) { 
		// Импортирует значения для каждого дополнительного поля, основываясь на его параметрах.
		$rmsg['fp_' . $exfld['field_name']] = cot_import_extrafields('rmsg' . $exfld['field_name'], $exfld, 'P', '', 'forums_post_'); 
	} 
}

 

// Проверяет, были ли ошибки в процессе выполнения предыдущих операций.
if (!cot_error_found()) { 
	// Если ошибок нет, продолжается выполнение следующего кода.

	// Проверяет, начинается ли заголовок темы с символа "#".
	if (mb_substr($rtopic['ft_title'], 0 ,1) == "#") { 
		// Если заголовок начинается с "#", этот символ удаляется.
		$rtopic['ft_title'] = str_replace('#', '', $rtopic['ft_title']); 
	}

	// Устанавливает начальные значения для темы.
	$rtopic['ft_state'] = 0;  // Состояние темы (обычно неактивное).
	$rtopic['ft_sticky'] = 0;  // Отметка о том, является ли тема закрепленной.
	$rtopic['ft_cat'] = $s;  // Категория темы.
	$rtopic['ft_creationdate'] = (int) Cot::$sys['now'];  // Дата создания темы.
	$rtopic['ft_updated'] = (int) Cot::$sys['now'];  // Дата последнего обновления темы.
	$rtopic['ft_postcount'] = 1;  // Количество сообщений в теме.
	$rtopic['ft_viewcount'] = 0;  // Количество просмотров темы.
	$rtopic['ft_firstposterid'] = (int) Cot::$usr['id'];  // ID первого автора.
	$rtopic['ft_firstpostername'] = Cot::$usr['name'];  // Имя первого автора.
	$rtopic['ft_lastposterid'] = (int) Cot::$usr['id'];  // ID последнего автора.
	$rtopic['ft_lastpostername'] = Cot::$usr['name'];  // Имя последнего автора.

	// Вставка темы в таблицу форума.
	Cot::$db->insert(Cot::$db->forum_topics, $rtopic); 

	// Получаем ID только что вставленной темы.
	$q = Cot::$db->lastInsertId(); 

	// Заполняет информацию о сообщении.
	$rmsg['fp_cat'] = $s;  // Категория сообщения.
	$rmsg['fp_topicid'] = (int) $q;  // ID темы.
	$rmsg['fp_posterid'] = (int) Cot::$usr['id'];  // ID автора сообщения.
	$rmsg['fp_postername'] = Cot::$usr['name'];  // Имя автора сообщения.
	$rmsg['fp_creation'] = (int) Cot::$sys['now'];  // Время создания сообщения.
	$rmsg['fp_updated'] = (int) Cot::$sys['now'];  // Время последнего обновления сообщения.
	$rmsg['fp_posterip'] = Cot::$usr['ip'];  // IP-адрес автора сообщения.

	// Вставка сообщения в таблицу постов форума.
	Cot::$db->insert(Cot::$db->forum_posts, $rmsg);

	// Получаем ID только что вставленного сообщения.
	$p = Cot::$db->lastInsertId(); 

	// Проверяет, нужно ли выполнить автоматическую очистку старых тем.
	if (Cot::$cfg['forums']['cat_' . $s]['autoprune'] > 0) { 
		// Если включена автоматическая очистка, выполняется функция по удалению старых тем.
		cot_forums_prunetopics('updated', $s, Cot::$cfg['forums']['cat_' . $s]['autoprune']); 
	}

	// Перемещает файлы, связанные с дополнительными полями, если такие есть.
	cot_extrafield_movefiles(); 

	// Обновляет количество сообщений у пользователя.
    cot_forums_updateUserPostCount(Cot::$usr['id']); 

    // Обновляет счетчики структуры форума для выбранной категории.
    cot_forums_updateStructureCounters($s); 

	// Выполнение хуков после создания темы и сообщения.
	/* === Hook === */
	foreach (cot_getextplugins('forums.newtopic.newtopic.done') as $pl) { 
		include $pl; 
	} 
	/* ===== */

	// Обновление защиты от CSRF атак.
	cot_shield_update(45, "New topic"); 

	// Перенаправление пользователя на страницу с новым сообщением.
	cot_redirect(cot_url('forums', "m=posts&q=$q&n=last", '#bottom', true)); 
} 
} // конец условия if ($a == 'newtopic') {

 

// Строит путь навигации для форума на основе категории $s.
$crumbs = cot_forums_buildpath($s); 
// Добавляет текущую ссылку на создание новой темы в хлебные крошки.
$crumbs[] = [cot_url('forums', ['m' => 'newtopic', 's' => $s]), Cot::$L['forums_newtopic']]; 
// Создает строку хлебных крошек для отображения в верхней части страницы.
$toptitle = cot_breadcrumbs($crumbs, Cot::$cfg['homebreadcrumb']); 
// Добавляет специальную метку для администраторов, если пользователь является администратором.
$toptitle .= (Cot::$usr['isadmin']) ? Cot::$R['forums_code_admin_mark'] : ''; 

// Устанавливает сублокатор для страницы форума, используя название категории.
Cot::$sys['sublocation'] = Cot::$structure['forums'][$s]['title']; 
// Устанавливает подзаголовок страницы на основе локализованного текста.
Cot::$out['subtitle'] = Cot::$L['forums_newtopic']; 
// Проверяет, установлен ли в выходном массиве ключ 'head'.
if (!isset(Cot::$out['head'])) { 
    Cot::$out['head'] = '';  // Если не установлен, инициализирует его как пустую строку.
} 
// Добавляет мета-тег noindex для страницы, чтобы избежать индексации поисковиками.
Cot::$out['head'] .= Cot::$R['code_noindex']; 

/* === Hook === */
// Выполняет плагины, которые могут быть подключены в хуке 'forums.newtopic.main'.
foreach (cot_getextplugins('forums.newtopic.main') as $pl) { 
	include $pl; 
} 
/* ===== */

// Подключает необходимые файлы для работы с формами.
require_once cot_incfile('forms'); 
// Подключает заголовок страницы.
require_once Cot::$cfg['system_dir'] . '/header.php'; 

// Определяет путь к файлу шаблона для отображения новой темы в форуме.
$mskin = cot_tplfile(array('forums', 'newtopic', Cot::$structure['forums'][$s]['tpl'])); 
// Инициализирует объект шаблона XTemplate с выбранным файлом шаблона.
$t = new XTemplate($mskin);

 

// Присваивает значения переменным шаблона для отображения на странице.
$t->assign([
    // Название для новой темы форума.
    'FORUMS_NEWTOPIC_TITLE' => Cot::$L['forums_newtopic'], 
    // Хлебные крошки для навигации на странице.
    'FORUMS_NEWTOPIC_BREADCRUMBS' => $toptitle,
    // Описание категории форума с поддержкой автоматических ссылок.
    'FORUMS_NEWTOPIC_SUBTITLE' => htmlspecialchars(cot_parse_autourls(Cot::$structure['forums'][$s]['desc'])),
    // Действие формы, которое будет отправлено при создании новой темы.
    'FORUMS_NEWTOPIC_FORM_ACTION' => cot_url('forums', ['m' => 'newtopic', 'a' => 'newtopic', 's' => $s]),
    // Поле для ввода заголовка темы.
    'FORUMS_NEWTOPIC_FORM_TITLE' => cot_inputbox('text', 'rtopictitle', $rtopic['ft_title'], ['maxlength' => 255]),
    // Поле для ввода описания темы.
    'FORUMS_NEWTOPIC_FORM_DESCRIPTION' => cot_inputbox('text', 'rtopicdesc', $rtopic['ft_desc'], ['maxlength' => 255]),
    // Поле для ввода текста сообщения в теме.
    'FORUMS_NEWTOPIC_FORM_TEXT' => cot_textarea('rmsgtext', $rmsg['fp_text'], 20, 56, '', 'input_textarea_' . $minimaxieditor),
    // Время редактирования поста, если оно разрешено в настройках.
    'FORUMS_NEWTOPIC_EDIT_TIMEOUT' => Cot::$cfg['forums']['edittimeout'] > 0
        ? cot_build_timegap(0, Cot::$cfg['forums']['edittimeout'] * 3600)
        : '',
]);

// Если активирован режим legacy (устаревший).
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
    // @deprecated in 0.9.26
    // Присваивает старые переменные шаблона для старой версии.
    $t->assign([
        'FORUMS_EDITPOST_PAGETITLE' => $toptitle,
        'FORUMS_NEWTOPIC_SEND' => cot_url('forums', "m=newtopic&a=newtopic&s=".$s),
        'FORUMS_NEWTOPIC_TITLE' => cot_inputbox('text', 'rtopictitle', $rtopic['ft_title'], array('maxlength' => 255)),
        'FORUMS_NEWTOPIC_DESC' => cot_inputbox('text', 'rtopicdesc', $rtopic['ft_desc'], array('maxlength' => 255)),
        'FORUMS_NEWTOPIC_TEXT' => cot_textarea('rmsgtext', $rmsg['fp_text'], 20, 56, '', 'input_textarea_'.$minimaxieditor),
        'FORUMS_NEWTOPIC_EDITTIMEOUT' => Cot::$cfg['forums']['edittimeout'] > 0
            ? cot_build_timegap(0, Cot::$cfg['forums']['edittimeout'] * 3600)
            : '',
    ]);
}

 

// Если существуют дополнительные поля для постов форума
if (!empty(Cot::$extrafields[Cot::$db->forum_posts])) {
    // Для каждого дополнительного поля
    foreach (Cot::$extrafields[Cot::$db->forum_posts] as $exfld) {
        // Преобразуем имя поля в верхний регистр
        $uname = strtoupper($exfld['field_name']); // Преобразование имени поля в верхний регистр для использования в шаблоне
        // Строим HTML для дополнительного поля
        $exfld_val = cot_build_extrafields('rmsg' . $exfld['field_name'], $exfld, $rmsg['fp_' . $exfld['field_name']]); // Генерация HTML для поля
        // Получаем заголовок для дополнительного поля
        $exfld_title = cot_extrafield_title($exfld, 'forums_post_'); // Получение заголовка для дополнительного поля

        // Присваиваем значения в шаблон для отображения дополнительных полей
        $t->assign([
            'FORUMS_NEWTOPIC_FORM_' . $uname => $exfld_val, // Присваиваем значение дополнительного поля в шаблон
            'FORUMS_NEWTOPIC_FORM_' . $uname . '_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля в шаблон
            'FORUMS_NEWTOPIC_FORM_EXTRAFLD' => $exfld_val, // Присваиваем значение дополнительного поля (повторно)
            'FORUMS_NEWTOPIC_FORM_EXTRAFLD_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля (повторно)
        ]);

        // Если включен режим legacy (устаревшая версия)
        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
            // @deprecated in 0.9.26
            // Присваиваем старые переменные шаблона для устаревшей версии
            $t->assign([
                'FORUMS_NEWTOPIC_' . $uname => $exfld_val, // Присваиваем значение дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_' . $uname . '_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_EXTRAFLD' => $exfld_val, // Присваиваем значение дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_EXTRAFLD_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля для устаревшей версии
            ]);
        }
        // Разбираем дополнительное поле для отображения на странице
        $t->parse('MAIN.EXTRAFLD'); // Парсим дополнительное поле для отображения в шаблоне
    }
}

 

// Если существуют дополнительные поля для темы форума
if (!empty(Cot::$extrafields[Cot::$db->forum_topics])) {
    // Для каждого дополнительного поля темы форума
    foreach (Cot::$extrafields[Cot::$db->forum_topics] as $exfld) {
        // Преобразуем имя поля в верхний регистр
        $uname = strtoupper($exfld['field_name']); // Преобразование имени поля в верхний регистр для использования в шаблоне
        // Строим HTML для дополнительного поля
        $exfld_val = cot_build_extrafields('rtopic' . $exfld['field_name'], $exfld, $rtopic['ft_' . $exfld['field_name']]); // Генерация HTML для поля
        // Получаем заголовок для дополнительного поля
        $exfld_title = cot_extrafield_title($exfld, 'forums_topic_'); // Получение заголовка для дополнительного поля

        // Присваиваем значения в шаблон для отображения дополнительных полей темы
        $t->assign([
            'FORUMS_NEWTOPIC_FORM_TOPIC_' . $uname => $exfld_val, // Присваиваем значение дополнительного поля темы в шаблон
            'FORUMS_NEWTOPIC_FORM_TOPIC_' . $uname . '_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля темы в шаблон
            'FORUMS_NEWTOPIC_FORM_TOPIC_EXTRAFLD' => $exfld_val, // Присваиваем значение дополнительного поля темы (повторно)
            'FORUMS_NEWTOPIC_FORM_TOPIC_EXTRAFLD_TITLE' => $exfld_title // Присваиваем заголовок дополнительного поля темы (повторно)
        ]);

        // Если включен режим legacy (устаревшая версия)
        if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
            // @deprecated in 0.9.26
            // Присваиваем старые переменные шаблона для устаревшей версии
            $t->assign([
                'FORUMS_NEWTOPIC_TOPIC_' . $uname => $exfld_val, // Присваиваем значение дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_TOPIC_' . $uname . '_TITLE' => $exfld_title, // Присваиваем заголовок дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_TOPIC_EXTRAFLD' => $exfld_val, // Присваиваем значение дополнительного поля для устаревшей версии
                'FORUMS_NEWTOPIC_TOPIC_EXTRAFLD_TITLE' => $exfld_title // Присваиваем заголовок дополнительного поля для устаревшей версии
            ]);
        }

        // Разбираем дополнительное поле для темы для отображения на странице
        $t->parse('MAIN.TOPIC_EXTRAFLD'); // Парсим дополнительное поле для темы для отображения в шаблоне
    }
}

 

// Если разрешено создавать приватные темы в категории форума
if (Cot::$cfg['forums']['cat_' . $s]['allowprvtopics']) {
    // Присваиваем в шаблон чекбокс для выбора приватной темы
    $t->assign('FORUMS_NEWTOPIC_FORM_PRIVATE', cot_checkbox($rtopic['ft_mode'], 'rtopicmode')); // Чекбокс для приватной темы, если она разрешена

    // Если включен режим legacy (устаревшая версия)
    if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
        // @deprecated in 0.9.26
        // Присваиваем старую переменную шаблона для устаревшей версии
        $t->assign([
            'FORUMS_NEWTOPIC_ISPRIVATE' => cot_checkbox($rtopic['ft_mode'], 'rtopicmode'), // Присваиваем старую переменную для приватной темы
        ]);
    }

    // Разбираем блок с настройкой приватности темы для отображения на странице
    $t->parse('MAIN.PRIVATE'); // Парсим блок с чекбоксом приватной темы для отображения в шаблоне
}

/* === Hook === */
// Подключаем плагины, связанные с тегами для новой темы форума
foreach (cot_getextplugins('forums.newtopic.tags') as $pl) {
    include $pl; // Включаем плагин для тегов
}
/* ===== */

// Отображаем все сообщения на странице
cot_display_messages($t); // Отображение сообщений, если они есть

// Разбираем основной шаблон и выводим его
$t->parse('MAIN'); // Парсим основной шаблон
$t->out('MAIN'); // Выводим основной шаблон

// Подключаем футер страницы
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключение футера

 

Заключение по назначению файла "forums.newtopic.php"

Файл "forums.newtopic.php" является важной частью модуля форума в системе Cotonti CMF, отвечая за процесс создания новой темы на форуме. Он выполняет несколько ключевых функций:

  1. Валидация данных: Проверяет введённые пользователем данные, такие как заголовок и текст темы, на корректность (например, минимальная длина). Также проверяется, есть ли у пользователя соответствующие права для создания темы.
  2. Создание записи в базе данных: Если данные валидны, файл добавляет новую тему в базу данных, создаёт первое сообщение и связывает его с темой.
  3. Обработка экстра-полей: Поддерживает возможность добавления дополнительных пользовательских полей как для самой темы, так и для сообщений.
  4. Интеграция с плагинами: Предоставляет хуки, через которые можно расширять функциональность сайта, подключая сторонние плагины.
  5. Отображение формы для создания темы: Генерирует и выводит HTML форму, в которой пользователи могут ввести данные для новой темы, а также отображает дополнительные настройки, такие как приватность или экстра-поля.
  6. Защита от атак: Использует защиту от CSRF и другие механизмы безопасности для предотвращения несанкционированных действий.

Этот файл служит как интерфейс для пользователей форума, а также обеспечивает механизмы для серверной логики, безопасности и интеграции с другими модулями и плагинами.

Основные поля, которые выводятся в шаблон для создания новой темы:

  1. Заголовок темы (rtopictitle): Поле для ввода заголовка темы форума.

  2. Описание темы (rtopicdesc): Поле для ввода краткого описания темы.

  3. Текст сообщения (rmsgtext): Поле для ввода текста первого сообщения в теме (основное содержание).

  4. Приватность темы (rtopicmode): Чекбокс для установки приватности темы, если в категории форума разрешены приватные темы.

  5. Экстра-поля для темы:

    • Экстра-поля могут быть добавлены в форму в зависимости от конфигурации и пользовательских настроек форума. Эти поля могут включать различные дополнительные данные, такие как текстовые поля, выбор даты, флажки и другие поля, которые администратор может настроить в системе.
  6. Информация о тайм-ауте на редактирование (FORUMS_NEWTOPIC_EDIT_TIMEOUT): В шаблоне может отображаться информация о времени, в течение которого разрешено редактировать тему, если такой параметр настроен в конфигурации форума.

  7. Хлебные крошки (FORUMS_NEWTOPIC_BREADCRUMBS): Отображение навигационных ссылок, которые позволяют пользователю вернуться к предыдущим страницам или разделам форума.

  8. Название страницы (FORUMS_NEWTOPIC_TITLE): Заголовок страницы с формой создания новой темы.

  9. Форма и кнопка отправки: Включает в себя кнопку для отправки данных формы на сервер для создания новой темы.

Эти поля отвечают за сбор и отображение данных, необходимых для создания новой темы и её первого сообщения.

 

16 минут чтения Sodium Carbonate

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

webitproff

Онлайн

Sodium Carbonate

Последняя авторизация: 19.07.2026 01:09

  • Страница размещена: 10.02.2025 16:37
  • Последнее обновление: 11.02.2025 19:47

Похожие страницы

Файл forums.setup.php в Cotonti
1 Описание файла forums.setup.php в Cotonti CMF 1. Основное назначение файла и его место в системе Cotonti Файл
Файл forums.php в Cotonti
2 Файл forums.php является основным скриптом, отвечающим за работу модуля форума в системе Cotonti CMF. Он расположен в
Файл "forums.extrafields.php" в системе Cotonti CMF
3 Файл "forums.extrafields.php" в системе Cotonti CMF является частью модуля Forums и используется для
Файл "forums.admin.php" в Cotonti
4 Файл "forums.admin.php" в Cotonti CMF — это административный скрипт, который управляет функциональностью
Файл forums.trashcan.php в Cotonti
5 Файл forums.trashcan.php в Cotonti CMF предназначен для обработки и поддержки функционала корзины для модуля форумов.