Файл page.add.php в Cotonti
предоставляет администраторам и пользователям с соответствующими правами, форму создания новый страницы, заполнять их мета-данные, описания
Описание кода файла "page.add.php" в Cotonti CMF
Основное назначение файла и его место в системе Cotonti
Файл "page.add.php" в системе Cotonti CMF предназначен для обработки добавления новых страниц в систему. Он является важной частью административного интерфейса сайта, позволяя администраторам и пользователям с соответствующими правами создавать новые страницы, заполнять их мета-данные, описания, а также управлять дополнительными полями и аттрибутами страницы.
Этот файл находится в директории модуля /modules/page/ и работает как серверный сценарий для добавления страниц через административный интерфейс сайта. Он включает логику и взаимодействие с пользователем на этапах подачи формы, обработки данных и вывода результата. Также важным аспектом является управление метаданными страниц, такими как заголовки, ключевые слова, URL-адреса, даты, категории и другие параметры.
Взаимодействие с другими частями сайта
Файл "page.add.php" взаимодействует с несколькими компонентами системы:
- Модуль "pages": Он используется для работы с страницами, такими как создание, редактирование, вывод и управление дополнительными полями.
- Шаблоны (templates): Взаимодействует с шаблонами для вывода формы добавления страницы.
- Плагины: Файл использует хуки для расширяемости, позволяя подключать дополнительные функции через плагины.
- Переменные конфигурации: Работает с переменными конфигурации, хранящими настройки для страницы и глобальные параметры системы.
- Функции и классы Cotonti: Использует стандартные функции и классы Cotonti для работы с данными (например, для генерации полей формы, вывода сообщений и обработки ошибок).
Переменные, хуки, методы, функции и классы
-
Переменные:
Cot::$out: Массив, который хранит данные для вывода в шаблон, такие как заголовок страницы, мета-информация, хлебные крошки и т. д.Cot::$L: Массив локализованных строк, используемый для вывода текста на разных языках (например,Cot::$L['page_addtitle']).Cot::$cfg: Массив конфигурационных параметров системы, например,Cot::$cfg['page']['autovalidate']для автоподтверждения.Cot::$usr: Массив данных о текущем пользователе (например,Cot::$usr['isadmin']проверяет, является ли пользователь администратором).$breadcrumbs: Массив хлебных крошек для навигации по сайту.$pageadd_array: Массив данных, который передается в шаблон и содержит параметры формы добавления страницы.
-
Хуки:
page.add.main: Этот хук позволяет подключать дополнительные плагины и расширения в процессе добавления страницы.page.add.tags: Хук для подключения плагинов, которые могут изменять теги и элементы формы добавления страницы.
-
Методы и функции:
cot_url(): Функция для генерации URL-адресов, используемая для формирования ссылки на добавление страницы.cot_selectbox_structure(): Функция для генерации выпадающих списков с категориями страниц.cot_inputbox(): Функция для генерации текстовых полей ввода для различных параметров страницы.cot_textarea(): Функция для генерации многострочных текстовых полей.cot_display_messages(): Функция для отображения сообщений об ошибках или успехах.cot_build_extrafields(): Функция для генерации дополнительных полей на основе их конфигурации.cot_extrafield_title(): Функция для получения заголовков дополнительных полей.cot_selectbox_date(): Функция для генерации выпадающих списков с датами (например, для указания даты создания страницы).cot_build_user(): Функция для генерации ссылки на пользователя (владельца страницы).
-
Классы:
XTemplate: Класс для работы с шаблонами, который используется для рендеринга данных в HTML.
Суть содержания кода
Этот файл обрабатывает запросы на создание новой страницы на сайте. Он выполняет несколько основных задач:
- Подготовка данных: Создание массива
$pageadd_array, который включает все необходимые поля для формы добавления страницы, такие как название, описание, метаданные, дополнительные поля и т. д. - Шаблонизация: Использование библиотеки
XTemplateдля обработки и вывода формы добавления страницы. Все данные передаются в шаблон для отображения на стороне пользователя. - Обработка дополнительных полей: Если для страниц настроены дополнительные поля, они добавляются к форме.
- Обработка ошибок и сообщений: Вывод сообщений об ошибках или успешных действиях с помощью функции
cot_display_messages(). - Плагины: Использование хуков для подключения дополнительных функций и плагинов через систему расширений.
- Управление правами доступа: Проверка прав пользователя (например, администратор может сразу публиковать страницу).
- Подключение внешних файлов: Файл подключает другие компоненты сайта, такие как заголовок страницы и футер.
Задачи, функции и условия, выполняемые файлом
- Создание страницы: Основная цель этого файла — создание новой страницы с помощью формы, которая заполняется пользователем.
- Публикация и доступ: В зависимости от настроек конфигурации и прав пользователя, он может либо сразу публиковать страницу, либо оставить ее на проверку.
- Дополнительные поля: Формы могут содержать дополнительные настраиваемые поля, которые позволяют администраторам добавлять специфичные данные к страницам.
- Управление мета-данными: Форма позволяет задавать мета-заголовки, описание и ключевые слова для страницы, что полезно для SEO.
- Обработка ошибок: Если пользователь вводит неверные данные или возникла ошибка, она будет отображена на странице.
Как владельцу сайта использовать данный файл
Владелец сайта может использовать этот файл для настройки и управления созданием новых страниц на своем сайте. Это включает в себя:
- Настройка полей: Используя дополнительные поля, можно настроить формы для сбора информации о страницах, например, для SEO-оптимизации.
- Управление доступом: Администраторы могут настраивать права доступа, чтобы только определенные пользователи могли создавать или редактировать страницы.
- Использование плагинов: Возможность расширить функционал через хуки и плагины, подключая дополнительные функции в процесс добавления страниц.
- SEO-оптимизация: Модификация мета-данных страниц, таких как ключевые слова, описание и заголовки.
Стиль написания PHP-кода и совместимость с версиями PHP
- Стиль написания: Код написан в стиле PHP5 и выше. В нем используется объектно-ориентированный подход для работы с шаблонами (через класс
XTemplate) и массивами для хранения данных, что характерно для более современных версий PHP. Весь код структурирован и легко расширяем. - Совместимость с PHP: Код совместим с версиями PHP5.6 и выше, однако рекомендуется использовать PHP7 и выше для обеспечения лучшей производительности и безопасности.
Заключение
Файл "page.add.php" является важной частью системы Cotonti, отвечающей за добавление страниц в систему. Он предоставляет форму для создания новых страниц с множеством настраиваемых полей, управляет правами пользователей, выводит ошибки и подключает дополнительные плагины для расширяемости.
<?php
/**
* Add page.
*
* @package Page
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
defined('COT_CODE') or die('Wrong URL'); // Проверка на правильность вызова файла, если файл был вызван напрямую, скрипт завершится с ошибкой.
require_once cot_incfile('forms'); // Подключение файла 'forms.php' для работы с формами в системе Cotonti.
$id = cot_import('id', 'G', 'INT'); // Импорт параметра 'id' из глобальных данных GET (если есть), ожидается целое число.
$c = cot_import('c', 'G', 'TXT'); // Импорт параметра 'c' из глобальных данных GET, ожидается строка.
if (empty($c) && !isset(Cot::$structure['page'][$c])) { // Если параметр 'c' пуст или не существует в структуре страниц Cotonti.
$c = ''; // Устанавливается пустое значение для переменной 'c'.
}
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', 'any'); // Получение прав доступа пользователя (чтение, запись, администратор) для страницы.
/* === Hook === */
foreach (cot_getextplugins('page.add.first') as $pl) { // Выполнение хуков, подключаемых для действия 'page.add.first'.
include $pl; // Подключение каждого плагина, найденного для этого хука.
}
/* ===== */
cot_block(Cot::$usr['auth_write']); // Проверка прав на запись для текущего пользователя. Если прав нет — доступ заблокирован.
Cot::$sys['parser'] = Cot::$cfg['page']['parser']; // Устанавливается значение парсера для страниц из конфигурации.
$parser_list = cot_get_parsers(); // Получение списка доступных парсеров для контента.
if ($a == 'add') { // Проверка, если действие равно 'add' (добавление страницы).
cot_shield_protect(); // Защита от CSRF атак, проверка на корректность токена сессии.
/* === Hook === */
foreach (cot_getextplugins('page.add.add.first') as $pl) { // Выполнение хуков перед обработкой добавления страницы.
include $pl; // Подключение каждого плагина для этого хука.
}
/* ===== */
$rpage = cot_page_import('POST', array(), Cot::$usr); // Импорт данных страницы из формы, переданных через метод POST. Данные обрабатываются для текущего пользователя.
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', $rpage['page_cat']); // Получение прав доступа пользователя (чтение, запись, администратор) для категории страницы.
cot_block(Cot::$usr['auth_write']); // Проверка прав на запись для текущего пользователя. Если прав нет — доступ заблокирован.
/* === Hook === */
foreach (cot_getextplugins('page.add.add.import') as $pl) { // Выполнение хуков во время импорта данных страницы.
include $pl; // Подключение каждого плагина для этого хука.
}
/* ===== */
cot_page_validate($rpage); // Валидация данных страницы перед добавлением.
/* === Hook === */
foreach (cot_getextplugins('page.add.add.error') as $pl) { // Выполнение хуков в случае ошибок во время добавления страницы.
include $pl; // Подключение каждого плагина для этого хука.
}
/* ===== */
if (!cot_error_found()) { // Если ошибок не найдено, продолжаем обработку добавления страницы.
$id = cot_page_add($rpage, Cot::$usr); // Добавление страницы в базу данных и получение её ID.
switch ($rpage['page_state']) { // Обработка состояния страницы после добавления.
case 0:
$r_url = cot_page_url($rpage, [], '', true); // Если страница опубликована, создается URL страницы.
break;
case 1:
$r_url = cot_url('message', 'msg=300', '', true); // Если страница ожидает утверждения, перенаправление на страницу сообщения.
break;
case 2:
cot_message('page_savedasdraft'); // Если страница сохранена как черновик, выводится сообщение.
$r_url = cot_url('page', 'm=edit&id='.$id, '', true); // Перенаправление на редактирование страницы.
break;
}
cot_redirect($r_url); // Перенаправление пользователя в зависимости от состояния страницы.
} else { // Если были ошибки при добавлении страницы.
$urlParams = ['m' => 'add']; // Параметры для URL, если произошла ошибка при добавлении.
if (!empty($c)) { // Если передана категория, добавляем её в параметры.
$urlParams['c'] = $c;
}
cot_redirect(cot_url('page', $urlParams, '', true)); // Перенаправление на страницу добавления с ошибками.
}
}
$rpage = [ // Инициализация массива с пустыми значениями для всех ключевых данных страницы.
'page_keywords' => '', // Ключевые слова страницы.
'page_metatitle' => '', // Мета-тайтл страницы.
'page_metadesc' => '', // Мета-описание страницы.
'page_alias' => '', // Псевдоним страницы (SEO-оптимизация).
'page_title' => '', // Заголовок страницы.
'page_desc' => '', // Описание страницы.
'page_author' => '', // Автор страницы.
'page_file' => '', // Файл, связанный с страницей (если есть).
'page_url' => '', // URL страницы.
'page_size' => '', // Размер страницы.
'page_text' => '', // Основной текст страницы.
];
// Page cloning support
$clone = cot_import('clone', 'G', 'INT'); // Получаем параметр 'clone' из URL (если он передан) как целое число.
if ($clone > 0) { // Если параметр 'clone' больше 0 (означает, что требуется клонировать страницу).
$rpage = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $clone)->fetch(); // Запрос в базу данных для получения данных страницы с указанным ID.
if (!$rpage) { // Если страница с таким ID не найдена.
cot_die_message(404); // Выводим сообщение об ошибке 404 (страница не найдена).
}
}
if (empty($rpage['page_cat'])) { // Если категория страницы не указана.
$rpage['page_cat'] = isset($c) ? $c : ''; // Устанавливаем категорию страницы, если параметр 'c' существует, или оставляем пустым.
}
$breadcrumbs = []; // Инициализация массива для хлебных крошек (не используется на данном этапе).
$urlParams = ['m' => 'add']; // Параметры для URL, указывающие на действие добавления страницы.
if (!empty($rpage['page_cat'])) { // Если категория страницы не пуста.
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', $rpage['page_cat']); // Проверка прав пользователя для данной категории страницы.
cot_block(Cot::$usr['auth_write']); // Если у пользователя нет прав на запись, выполнение будет остановлено.
if (!Cot::$usr['isadmin'] && Cot::$structure['page'][$rpage['page_cat']]['locked']) { // Если пользователь не является администратором и категория страницы заблокирована.
cot_die_message(602, TRUE); // Выводим сообщение об ошибке (код 602 — доступ запрещен для категории).
}
Cot::$sys['sublocation'] = Cot::$structure['page'][$rpage['page_cat']]['title']; // Устанавливаем подзаголовок (sublocation) в зависимости от категории страницы.
$mskin = cot_tplfile(['page', 'add', Cot::$structure['page'][$rpage['page_cat']]['tpl']]); // Загружаем шаблон для страницы в зависимости от категории.
$breadcrumbs = cot_structure_buildpath('page', $rpage['page_cat']); // Строим хлебные крошки для текущей категории.
$urlParams['c'] = $rpage['page_cat']; // Добавляем параметр категории в URL.
} else { // Если категория страницы пуста.
if (!Cot::$usr['isadmin']) { // Если пользователь не является администратором.
// User can add page to these categories
$categories = []; // Инициализация массива доступных категорий.
if (!empty(Cot::$structure['page'])) { // Если есть страницы в структуре.
foreach (Cot::$structure['page'] as $i => $x) { // Проходим по всем категориям страниц.
$display = cot_auth('page', $i, 'W'); // Проверяем права на запись для категории.
if ($display && !empty($subcat) && isset(Cot::$structure['page'][$subcat])) { // Если категория доступна для записи и существует подкатегория.
$mtch = Cot::$structure['page'][$subcat]['path'] . "."; // Получаем путь подкатегории.
$mtchlen = mb_strlen($mtch); // Длина пути подкатегории.
$display = (mb_substr($x['path'], 0, $mtchlen) == $mtch || $i === $subcat); // Проверяем, соответствует ли путь категории подкатегории.
}
if ($i != 'all' && $display) { // Если категория не является "all" и доступна для записи.
$categories[] = $i; // Добавляем категорию в список доступных.
}
}
}
cot_block(count($categories) > 0); // Если нет доступных категорий для добавления страницы, выполнение будет остановлено.
}
Cot::$sys['sublocation'] = Cot::$L['page_addtitle']; // Устанавливаем подзаголовок для страницы добавления.
$mskin = cot_tplfile(['page', 'add']); // Загружаем шаблон для страницы добавления.
}
Cot::$out['subtitle'] = Cot::$L['page_addsubtitle']; // Устанавливаем подзаголовок страницы в вывод (заголовок страницы добавления).
if (!isset(Cot::$out['head'] )) { // Если в выводе не установлен блок 'head'.
Cot::$out['head'] = ''; // Инициализируем блок 'head' как пустую строку.
}
Cot::$out['head'] .= Cot::$R['code_noindex']; // Добавляем мета-тег для запрета индексирования страницы (noindex) в блок 'head'.
$breadcrumbs[] = [cot_url('page', $urlParams), Cot::$L['page_addtitle']]; // Добавляем хлебные крошки для страницы добавления.
/* === Hook === */
foreach (cot_getextplugins('page.add.main') as $pl) { // Подключаем расширения плагинов, связанных с добавлением страницы.
include $pl; // Включаем каждый найденный плагин.
}
/* ===== */
require_once Cot::$cfg['system_dir'].'/header.php'; // Подключаем файл заголовка системы (обычно для подключения необходимых библиотек и файлов).
$t = new XTemplate($mskin); // Инициализируем объект шаблонизатора XTemplate с выбранным шаблоном.
$pageadd_array = [ // Массив, содержащий все данные, необходимые для формы добавления страницы.
'PAGEADD_PAGETITLE' => Cot::$L['page_addtitle'], // Заголовок страницы добавления.
'PAGEADD_BREADCRUMBS' => cot_breadcrumbs($breadcrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки для страницы.
'PAGEADD_SUBTITLE' => Cot::$L['page_addsubtitle'], // Подзаголовок страницы добавления.
'PAGEADD_ADMINEMAIL' => 'mailto:' . Cot::$cfg['adminemail'], // Ссылка для отправки email администратору.
'PAGEADD_FORM_SEND' => cot_url('page', 'm=add&a=add&c=' . $c), // URL для отправки формы добавления страницы.
'PAGEADD_FORM_CAT' => cot_selectbox_structure('page', $rpage['page_cat'], 'rpagecat'), // Выпадающий список для выбора категории страницы.
'PAGEADD_FORM_CAT_SHORT' => cot_selectbox_structure('page', $rpage['page_cat'], 'rpagecat', $c), // Короткая версия выбора категории страницы.
'PAGEADD_FORM_KEYWORDS' => cot_inputbox('text', 'rpagekeywords', $rpage['page_keywords'], ['maxlength' => '255']), // Поле для ввода ключевых слов страницы.
'PAGEADD_FORM_METATITLE' => cot_inputbox('text', 'rpagemetatitle', $rpage['page_metatitle'], ['maxlength' => '255']), // Поле для ввода мета-заголовка страницы.
'PAGEADD_FORM_METADESC' => cot_textarea('rpagemetadesc', $rpage['page_metadesc'], 2, 64, ['maxlength' => '255']), // Поле для ввода мета-описания страницы.
'PAGEADD_FORM_ALIAS' => cot_inputbox('text', 'rpagealias', $rpage['page_alias'], ['maxlength' => '255']), // Поле для ввода псевдонима (алиаса) страницы.
'PAGEADD_FORM_TITLE' => cot_inputbox('text', 'rpagetitle', $rpage['page_title'], ['maxlength' => '255']), // Поле для ввода заголовка страницы.
'PAGEADD_FORM_DESCRIPTION' => cot_textarea('rpagedesc', $rpage['page_desc'], 2, 64, ['maxlength' => '255']), // Поле для ввода описания страницы.
'PAGEADD_FORM_AUTHOR' => cot_inputbox('text', 'rpageauthor', $rpage['page_author'], ['maxlength' => '100']), // Поле для ввода автора страницы.
'PAGEADD_FORM_OWNER' => cot_build_user(Cot::$usr['id'], Cot::$usr['name']), // Отображение владельца страницы (пользователя, который добавляет страницу).
'PAGEADD_FORM_OWNER_ID' => Cot::$usr['id'], // ID владельца страницы.
'PAGEADD_FORM_DATE' => cot_selectbox_date(Cot::$sys['now'], 'long', 'rpagedate'), // Поле для выбора даты создания страницы.
'PAGEADD_FORM_BEGIN' => cot_selectbox_date(Cot::$sys['now'], 'long', 'rpagebegin'), // Поле для выбора даты начала действия страницы.
'PAGEADD_FORM_EXPIRE' => cot_selectbox_date(0, 'long', 'rpageexpire'), // Поле для выбора даты окончания действия страницы.
'PAGEADD_FORM_FILE' => cot_selectbox( // Поле для выбора типа файла страницы (файл или ссылка).
$rpage['page_file'],
'rpagefile',
range(0, 2),
[Cot::$L['No'], Cot::$L['Yes'], Cot::$L['Members_only']],
false
),
'PAGEADD_FORM_URL' => cot_inputbox('text', 'rpageurl', $rpage['page_url'], ['maxlength' => '255']), // Поле для ввода URL страницы.
'PAGEADD_FORM_SIZE' => cot_inputbox('text', 'rpagesize', $rpage['page_size'], ['maxlength' => '255']), // Поле для ввода размера страницы.
'PAGEADD_FORM_TEXT' => cot_textarea('rpagetext', $rpage['page_text'], 24, 120, '', 'input_textarea_editor'), // Основное поле для ввода текста страницы (с редактором).
'PAGEADD_FORM_PARSER' => cot_selectbox(Cot::$cfg['page']['parser'], 'rpageparser', $parser_list, $parser_list, false), // Поле для выбора парсера (форматирования) текста страницы.
];
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Проверка, включен ли устаревший режим (legacy mode).
// @deprecated in 0.9.24
$t->assign([ // Назначение значений для шаблона, если legacyMode включен.
'PAGEADD_FORM_OWNERID' => Cot::$usr['id'], // ID владельца страницы.
'PAGEADD_FORM_DESC' => cot_textarea('rpagedesc', $rpage['page_desc'], 2, 64, ['maxlength' => '255']), // Текстовое поле для ввода описания страницы.
]);
}
$t->assign($pageadd_array); // Назначение значений из массива $pageadd_array в шаблон.
// Extra fields - Дополнительные поля
if (!empty(Cot::$extrafields[Cot::$db->pages])) { // Проверка, существуют ли дополнительные поля для страниц.
foreach (Cot::$extrafields[Cot::$db->pages] as $exfld) { // Проходим по всем дополнительным полям.
$uname = strtoupper($exfld['field_name']); // Преобразование имени поля в верхний регистр.
$data = isset($rpage['page_' . $exfld['field_name']]) ? $rpage['page_' . $exfld['field_name']] : null; // Получение данных для поля, если они есть.
$exfld_val = cot_build_extrafields('rpage' . $exfld['field_name'], $exfld, $data); // Генерация HTML для дополнительного поля.
$exfld_title = cot_extrafield_title($exfld, 'page_'); // Получение заголовка для дополнительного поля.
$t->assign([ // Назначение значений для шаблона.
'PAGEADD_FORM_' . $uname => $exfld_val, // Назначение значения для поля.
'PAGEADD_FORM_' . $uname . '_TITLE' => $exfld_title, // Назначение заголовка для поля.
'PAGEADD_FORM_EXTRAFLD' => $exfld_val, // Назначение значения для дополнительного поля.
'PAGEADD_FORM_EXTRAFLD_TITLE' => $exfld_title, // Назначение заголовка для дополнительного поля.
]);
$t->parse('MAIN.EXTRAFLD'); // Разбор дополнительного поля в шаблоне.
}
}
// Error and message handling - Обработка ошибок и сообщений
cot_display_messages($t); // Отображение сообщений об ошибках или успехах.
/* === Hook === */
foreach (cot_getextplugins('page.add.tags') as $pl) { // Подключение внешних плагинов для страницы добавления.
include $pl; // Включение плагина.
}
/* ===== */
$usr_can_publish = false; // Переменная, которая будет определять, может ли пользователь публиковать страницу.
if (Cot::$usr['isadmin']) { // Если пользователь является администратором.
if (Cot::$cfg['page']['autovalidate']) { // Если автоподтверждение включено в конфигурации страницы.
$usr_can_publish = true; // Администратор может публиковать страницу.
}
$t->parse('MAIN.ADMIN'); // Разбор блока для администраторов в шаблоне.
}
$t->parse('MAIN'); // Разбор основного шаблона.
$t->out('MAIN'); // Вывод основного шаблона.
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключение файла footer.php для завершения страницы.
Пояснения:
- Legacy Mode: Если установлен флаг
legacyMode, то назначаются специфические переменные для формы добавления страницы. - Дополнительные поля: Код добавляет дополнительные пользовательские поля для страницы, если они есть в конфигурации (
Cot::$extrafields). - Обработка сообщений: Используется функция
cot_display_messages(), чтобы отображать сообщения об ошибках или успехах. - Плагины: Включаются внешние плагины, если они зарегистрированы в системе.
- Административные функции: Если пользователь администратор и включено автоподтверждение, ему разрешается публиковать страницы без предварительного утверждения.
- Шаблон: Основной шаблон парсится и выводится с помощью
$t->parse()и$t->out().
Комментарии (0)
Автор контента
Оффлайн
Sodium Carbonate
Последняя авторизация: 19.07.2026 01:57
- Страница размещена: 02.02.2025 19:18
- Последнее обновление: 02.02.2025 19:28